Перейти к содержанию

Лекция 4. AI в жизненном цикле разработки ПО (SDLC)

Лекция 4 · ~75 мин · 58 слайдов

01 · 16 опытных разработчиков с AI работали на 19% дольше — а были уверены, что AI их ускоряет: ощущение продуктивности — гипотеза, не данные, поэтому надёжность даёт дисциплина, а не ощущение

Слайд 1. 16 опытных разработчиков с AI работали на 19% дольше — а были уверены, что AI их ускоряет: ощущение продуктивности — гипотеза, не данные, поэтому надёжность даёт дисциплина, а не ощущение

Начнём не с восторга и не с предостережения, а с измерения. В первой половине две тысячи двадцать пятого года исследовательская организация METR провела рандомизированный контролируемый эксперимент с шестнадцатью опытными разработчиками открытого кода [1]. Это были не студенты, а сопровождающие зрелых проектов с десятками тысяч звёзд, работавшие над двумястами сорока шестью реальными задачами в собственных, хорошо знакомых им кодовых базах [1]. Часть задач разрешали делать с современным AI-инструментом, часть — без; замеряли не ощущение, а реальное время выполнения [1].

Перед началом разработчики прогнозировали, что AI ускорит их примерно на двадцать четыре процента, а после эксперимента, уже поработав с инструментами, оценивали ускорение примерно в двадцать процентов. Объективные данные показали обратное: с разрешённым AI задачи занимали в среднем на девятнадцать процентов больше времени [1]. База, без которой это число не читается: это опытные разработчики на знакомом им коде, всего шестнадцать человек [1]; на незнакомой изолированной задаче эффект другой и положительный — к этому мы ещё вернёмся. Профессионалы, годами пишущие код, ошиблись не в величине, а в знаке.

Введём термин, который пройдёт сквозь всю лекцию. Разрыв восприятия — это расхождение между субъективным ощущением скорости и объективно измеренным фактом [1]. Это не значит, что AI всегда замедляет: на изолированных задачах он измеримо ускоряет. Это значит другое и более важное для инженера: «мне кажется, что инструмент помогает» — не данные, а гипотеза, и в разработке эта гипотеза систематически смещена [1]. А раз даже эксперт не может ощутить, помогает ему инструмент или мешает, то решение «применять ли AI и как» нельзя принимать по ощущению — его принимают по дисциплине: измеримым критериям, встроенным в процесс. Подумайте: ускоряет ли AI лично вас — и откуда вы это знаете?

Источники: [1] METR — RCT: AI и опытные OSS-разработчики (+19% времени)

02 · Лекция 4. AI в жизненном цикле разработки ПО

Слайд 2. Лекция 4. AI в жизненном цикле разработки ПО

Разработка ПО — первая отраслевая тема курса после трёх обзорных лекций, и выбрана она по двум причинам. Первая: это область, где генеративный AI применяется массово и где у нас лучшие на сегодня измерения, лучшие документированные провалы и, что важнее всего для этой лекции, наиболее зрелые методические практики — материал, на котором учат суждению, а не вере. Вторая: разработка ПО — индустрия, в которую вы как инженеры войдёте ближе и раньше всего, поэтому цена ошибочного суждения для вас лично максимальна.

Тезис всей лекции, который стоит держать в голове с первого слайда: AI меняет цену написания кода, но не цену понимания, что строить и кто за это отвечает; и он полезен ровно настолько, насколько вокруг него выстроена инженерная дисциплина по фазам жизненного цикла. Дорожная карта проста: после введения мы пройдём фазы разработки по порядку — требования, архитектура, реализация, тестирование, ревью и безопасность, доставка с эксплуатацией и документацией — и соберём всё в аппарат решения: матрицу «фаза × ведущая практика × где человек обязателен» и чек-лист «когда AI да, когда нет». В каждой фазе мы задаём три вопроса: какая методическая практика делает фазу надёжной, каким человеко-владеемым артефактом она заканчивается — и где в ней человек обязателен, а инструмент вторичен.

03 · Из Лекций 1–3 переносим готовый аппарат выбора архитектуры; Лекция 4 берёт одну индустрию и показывает, какая дисциплина делает AI надёжным по фазам

Слайд 3. Из Лекций 1–3 переносим готовый аппарат выбора архитектуры; Лекция 4 берёт одну индустрию и показывает, какая дисциплина делает AI надёжным по фазам

Эта лекция — первая отраслевая, и она стоит на фундаменте обзорного Модуля 1. Чтобы не тратить время на повторы, зафиксируем явно, что мы переносим готовым и не переобъясняем, а только применяем к разработке ПО. Из Лекции 1 берём слоистую картину «модель, чат, агент, приложение» и промпт как роль, задачу и контекст — это наш рабочий словарь. Из Лекции 2 — механизм, по которому AI выдаёт «почти правильный» текст: ответ генерируется потокенно сэмплингом, поэтому правдоподобный не значит верный; мы будем ссылаться на это одной фразой там, где нужно.

Из Лекции 3 переносим четыре блока. Лестница сложности — правило оставаться на нижней ступени архитектуры и подниматься только под явное требование задачи; в этой лекции оно вернётся как правило выбора уровня автономии в фазе реализации. Критерий «когда не ИИ вовсе» — для детерминированной верифицируемой задачи правильная архитектура это обычный код; применяем в каждой фазе. Цикл агента «планируй, действуй, проверяй, повторяй» с четырьмя местами отказа — кодинг-агент фазы реализации это ровно он, применённый к коду. И prompt injection — недоверенный контент в контексте модели может стать командой, а защита архитектурная, не фильтрацией; в разработке это материализуется в кейсе CamoLeak. Иначе говоря, Модуль 1 дал аппарат выбора архитектуры в общем виде, а Лекция 4 берёт одну индустрию и показывает, какая инженерная дисциплина делает применение AI в ней надёжным по фазам.

04 · Спор «внедрять AI в разработку или нет» индустрия закрыла: 84–90% разработчиков уже пользуются AI-инструментами, и доля растёт второй год подряд — при этом доля не доверяющих точности выводов выросла с 31% до 46%, поэтому открыт не вопрос «да или нет», а вопрос цены, рисков и мер

Слайд 4. Спор «внедрять AI в разработку или нет» индустрия закрыла: 84–90% разработчиков уже пользуются AI-инструментами, и доля растёт второй год подряд — при этом доля не доверяющих точности выводов выросла с 31% до 46%, поэтому открыт не вопрос «да или нет», а вопрос цены, рисков и мер

Прежде чем разбирать разработку по фазам, стоит зафиксировать масштаб, на котором всё это происходит. По данным опроса Stack Overflow за две тысячи двадцать пятый год — это более сорока девяти тысяч разработчиков из ста семидесяти семи стран — восемьдесят четыре процента используют или планируют использовать AI-инструменты в своей работе. Годом раньше их было семьдесят шесть процентов: за год доля выросла на восемь процентных пунктов. Отчёт DORA за тот же год, на выборке более пяти тысяч человек, даёт девяносто процентов уже использующих — рост на четырнадцать процентных пунктов к предыдущей волне. Формулировки вопросов у двух опросов разные, поэтому числа нельзя складывать или считать одной шкалой, но порядок величины они дают одинаковый. Половина профессиональных разработчиков работает с такими инструментами ежедневно, а медианное время работы с ними — около двух часов в день, то есть примерно четверть рабочего дня.

Важнее самих чисел то, что происходит с доверием. В том же опросе Stack Overflow доля тех, кто не доверяет точности выдаваемого AI-инструментами результата, выросла с тридцати одного до сорока шести процентов за год. У DORA картина того же знака: более восьмидесяти процентов респондентов говорят, что AI повысил их личную эффективность, но высоко доверяют результату лишь двадцать четыре процента. Ощущение пользы и доверие к конкретному выводу разошлись — и это ровно тот разрыв, который эта лекция разбирает по фазам.

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

Источники: [1] Stack Overflow — Developer Survey 2025, раздел AI · [2] DORA — State of AI-assisted Software Development 2025

05 · Центральный вопрос — не «какой инструмент лучший», а «какая дисциплина делает AI-разработку надёжной по фазам»: инструмент вторичен, практика первична

Слайд 5. Центральный вопрос — не «какой инструмент лучший», а «какая дисциплина делает AI-разработку надёжной по фазам»: инструмент вторичен, практика первична

Сформулируем центральный вопрос, к которому лекция будет возвращаться в каждой фазе. AI пишет код всё лучше — но что делает AI-разработку надёжной? Не инструмент, а инженерная дисциплина по фазам жизненного цикла: какой человеко-владеемый артефакт и какая проверка нужны на каждой фазе, где методики разных игроков сходятся, и что не делегируется инструменту ни в одной фазе. Узкое место разработки с AI — не набор кода, а само намерение: точно выразить, что строить, по-прежнему трудно [1].

Обратите внимание на формулировку: это не «какие бывают AI-инструменты» и не «какой инструмент лучший». Это вопрос о практике. И причина именно такая: инструменты меняются от квартала к кварталу, а практика «между намерением и кодом всегда стоит человеко-ревьюируемый артефакт» устойчива годами. Это подтверждает и системный вывод индустрии: AI усиливает то, что уже есть, — то есть первична дисциплина, а инструмент вторичен [2]. Больше того, вопрос «какой инструмент лучший» плохо поставлен — лучший для чего, в какой фазе, в каком режиме? Поэтому каждый раз, называя инструмент, мы будем отделять устойчивый паттерн, то есть методику, которая останется, от вендорского хайпа, маркетингового преувеличения, которое стоит перепроверять.

И то же самое касается целей лекции. Ни одна из них не звучит как «уметь пользоваться инструментом X». Первая — распознавать по фазе, где AI помогает, а где дисциплина не заменяется инструментом. Вторая — отличать методику от вендор-хайпа и понимать, почему инструмент вторичен [2]. Третья — применять чек-лист практик «когда AI да, когда нет» к своей задаче. Ответом лекции будет не «AI хорош» и не «AI плох», а аппарат, которым инженер для конкретной фазы называет уместную практику, её артефакт и точку обязательного человеческого контроля.

Источники: [1] Fowler — Interrogatory LLM · [2] Google — DORA 2025

06 · Эта лекция — сводка практик: современные подходы лидеров (Anthropic, OpenAI, GitHub, Google DORA, Thoughtworks, Willison) + проверенная временем классика (Brooks, Beck, Nygard, Ford/Parsons, Fowler, Brown)

Слайд 6. Эта лекция — сводка практик: современные подходы лидеров (Anthropic, OpenAI, GitHub, Google DORA, Thoughtworks, Willison) + проверенная временем классика (Brooks, Beck, Nygard, Ford/Parsons, Fowler, Brown)

Прежде чем нырять в фазы, честно покажем, откуда взяты все рекомендации этой лекции. Это не личные предпочтения и не пересказ рекламы вендоров, а сводка двух корпусов практик. Первый — современные подходы от тех, кто прямо сейчас строит инструменты и процессы: Anthropic с их AI-Native SDLC, где каждый этап коммитит версионируемый артефакт, а человек остаётся accountable на гейтах [1]; OpenAI с Model Spec, где спецификация становится контрактом и каждая её клауза работает как пример-промпт и тест [2]; GitHub Spec Kit с идеей «намерение — источник истины» и малыми проверяемыми задачами [3]; отчёт DORA 2025 с семью delivery-способностями и ключевым выводом «AI усиливает то, что уже есть» [4]; Thoughtworks и Бёкелер с серией Exploring Gen AI и понятием harness engineering, где ассистент предлагает, а разработчик владеет [5]; и Саймон Уиллисон с «vibe engineering» — списком дисциплин, которые LLM вознаграждает: тесты, планы, ревью [6].

Второй корпус — классика, выдержавшая десятилетия. Брукс с различением существенной и привнесённой сложности, где «что строить» остаётся человеку [7]; Кент Бек с TDD, где тест-как-спецификация задаёт red-green-refactor [8]; Найгард с ADR — неизменяемыми записями «почему» в системе контроля версий [9]; Форд и Парсонс с эволюционными архитектурами и fitness-функциями, делающими «пригодность» объективной и автоматической [10]; Фаулер с рефакторингом и дисциплиной малых проверяемых изменений [11]; и Саймон Браун с моделью C4 — архитектурой-как-кодом, текстовой диффабельной моделью, понятной AI [12].

Почему это важно показать сразу: инструменты и их «лидерство» меняются за кварталы, а эти практики устойчивы годами — потому что упираются в природу сложности [7], а не в зрелость конкретного продукта. Именно на пересечении свежих практик лидеров и проверенной классики мы и будем строить дисциплину по фазам.

07 · AI-разработка как дисциплина — это цикл человеко-владеемых артефактов спека→ADR→план→PR→инцидент, каждым владеет человек; на этом скелете сходятся методики разных игроков

Слайд 7. AI-разработка как дисциплина — это цикл человеко-владеемых артефактов спека→ADR→план→PR→инцидент, каждым владеет человек; на этом скелете сходятся методики разных игроков

Это ключевой слайд лекции, и от него зависит всё дальнейшее. Разработка ПО, если делать её как инженерную дисциплину, — это не «пишем код с ассистентом», а цикл человеко-владеемых артефактов. Спецификация превращается в архитектурное решение, оно в план, план в pull request, а эксплуатация рождает запись об инциденте, которая возвращается новым требованием в спецификацию. Назовём это git-loop дисциплины — «git», потому что все эти артефакты живут в системе контроля версий, версионируются и ревьюируются как код [1].

Читать эту цепочку надо так: каждый узел — человеко-владеемый артефакт, произведённый своей фазой; стрелка — передача его следующей фазе как контекста; обратная стрелка от инцидента к спецификации замыкает цикл. AI участвует внутри узлов — набрасывает спеку, предлагает архитектурное решение, пишет код в pull request, — но владеет каждым узлом человек: он читает, правит, принимает и отвечает за последствия [1]. Отдельно стоит назвать роль спецификации: в подходе Model Spec она — контракт, версионируемый рядом с кодом, а не мимолётный промпт [2]. Это и есть скелет, на который лекция нанизывает всё дальнейшее: не «инструмент на каждую фазу», а дисциплина производства версионируемых артефактов, которые питают AI и держат ответственность на человеке [4].

Ключевое свойство узла — определение фазы через вход, выход и артефакт: фаза берёт артефакт предыдущего узла, преобразует и выдаёт свой. Поэтому и вопрос про AI мы задаём конкретно: не «помогает ли AI», а «какая практика делает надёжной вот эту трансформацию». И последнее — сходимость: к этому же скелету фаз независимо пришли Anthropic [1], OpenAI [2], программа DORA [3] и Thoughtworks с их harness engineering, где ассистент предлагает, а человек владеет [4]. Разные игроки с разными интересами повторили один и тот же скелет — а значит, перед нами методика, а не мода.

Источники: [1] Anthropic — AI-Native SDLC playbook · [2] OpenAI — Model Spec · [3] Google — DORA 2025 · [4] Thoughtworks — Exploring Gen AI

08 · Лестница автономности A→D — вспомогательная линза (не несущая ось); и уровень автономии — свойство режима, а не бренда: один продукт живёт сразу на нескольких уровнях

Слайд 8. Лестница автономности A→D — вспомогательная линза (не несущая ось); и уровень автономии — свойство режима, а не бренда: один продукт живёт сразу на нескольких уровнях

Дадим одну вспомогательную линзу, которой будем пользоваться точечно, в основном в фазе реализации. Внутри любой фазы AI может участвовать с разной самостоятельностью — это лестница автономности, четыре режима от автодополнения до агента-оркестратора [2]. На уровне A — автодополнение: AI дописывает строку по контексту, человек принимает каждое предложение. B — мелкие задачи через чат: AI генерирует функцию или фикс, человек ставит задачу и ревьюит результат. C — кодинг-агент: AI планирует, правит много файлов, сам гоняет тесты и итерирует, а человек ревьюит pull request и решает о слиянии. D — оркестратор: AI берёт задачу из issue-трекера и делает PR, иногда несколькими агентами, а человек занят стратегией, одобрением и продакшен-гейтом.

Важный disclaimer: эта лестница — вспомогательная линза, а не несущая ось лекции. Несущее — цикл артефактов и практики фаз, которые мы видели на keystone; лестница отвечает лишь на узкий вопрос «насколько автономно» и молчит о том, какая фаза и какой артефакт. Общее правило лестницы: чем выше уровень автономии, тем строже и явнее должен быть критерий «здесь обязателен человек» и тем жёстче харнес вокруг агента.

И одно правило чтения, без которого лекция будет понята неверно: уровень автономии — это свойство режима работы, а не бренда инструмента [1]. Один и тот же продукт живёт сразу на нескольких уровнях. GitHub Copilot — это и автодополнение, и чат, и агентный режим, и оркестратор «issue в PR»; Cursor — это Tab, Cmd-K и агент Composer; Claude Code по умолчанию кодинг-агент и поднимается до оркестрации [2]. Две операциональные границы: между B и C — итерирует ли инструмент сам и гоняет ли тесты без вас; между C и D — откуда приходит задача и куда уходит результат. Практическое следствие: фраза «мы используем Copilot» не сообщает ни уровень автономии, ни фазу — это задаётся тем, как именно и в какой фазе вы его применяете [1]. Поэтому называть надо режим и фазу, а не логотип: важна практика, а не инструмент.

Источники: [1] Thoughtworks — Exploring Gen AI (Böckeler) · [2] Willison — using LLMs for code

09 · Инструмент вторичен — методика определяет, инструмент исполняет; «внедрили AI-инструмент» ≠ «внедрили AI-дисциплину», и первое без второго умножает беспорядок

Слайд 9. Инструмент вторичен — методика определяет, инструмент исполняет; «внедрили AI-инструмент» ≠ «внедрили AI-дисциплину», и первое без второго умножает беспорядок

Теперь предъявим несущую дихотомию всей лекции одним тезисом: методика определяет, инструмент исполняет [3]. Методическая практика — это решение о том, какой артефакт произвести, в каком порядке, с какой проверкой и кто отвечает; инструмент — исполнитель, взаимозаменяемый и вторичный. Из этого следует правило чтения всей лекции: в каждой фазе сначала называется практика — что делать и почему, кто её предписывает, каким артефактом она заканчивается, — и лишь потом инструменты, «вот чем это делают сегодня», компактным вторичным блоком с суждением «устойчивый паттерн или вендорский хайп».

Почему именно так, а не наоборот? По трём причинам. Первая — волатильность: инструменты меняются за кварталы, а практики вроде «спека до кода», «версионируемые решения», «человек на merge» устойчивы годами; существенная сложность задачи инструментом не снимается — она в самой задаче [1]. Вторая — множитель: AI усиливает то, что уже есть, поэтому первично построить дисциплину, а не выбрать инструмент [2]. Третья — ответственность: инструмент не отвечает за последствия, отвечает человек, а ответственность материализуется в человеко-владеемых артефактах и человеческих гейтах [3].

И теперь разберём главный режим отказа, который эта лекция лечит. Команда выбирает инструмент вместо практики: ставит модный AI-ассистент, гоняет в него задачи напрямую в код и считает, что «внедрила AI». Дисциплины при этом нет — нет спеки до кода, нет версионируемых решений, нет гейтов, человек не на merge. И здесь множитель работает в худшую сторону: AI усиливает то, что есть, а есть процесс без дисциплины, поэтому беспорядок множится быстрее, чем его успевают заметить [2]. Именно этот механизм стоит за всеми задокументированными провалами лекции: prompt-and-pray — инструмент без спека-дисциплины, отравленный контекст — без управления архитектурой, 70%-проблема — без ревью тридцати процентов, инцидент Replit — без человеческого прод-гейта. Каждый из них — не «AI ошибся», а «инструмент применён без практики». Урок: «мы внедрили AI-инструмент» — не то же, что «мы внедрили AI-дисциплину». Альтернатива — методико-first-порядок: сначала практика фазы, потом инструмент под неё [3]; инструмент выбирается под дисциплину, а не наоборот, и вся лекция — развёртка этого порядка по фазам.

Источники: [1] Brooks — No Silver Bullet · [2] Google — DORA 2025 · [3] Anthropic — AI-Native SDLC playbook

10 · Требования · spec-driven — фаза, где ведущее не код, а спецификация, которую человек написал, прочитал и принял

Слайд 10. Требования · spec-driven — фаза, где ведущее не код, а спецификация, которую человек написал, прочитал и принял

Начинаем проходить жизненный цикл по фазам, и первая — требования. Это фаза, которая превращает размытое человеческое намерение «хочу систему, которая делает X» в структурированный артефакт-спецификацию. Вход фазы — намерение, выход — спецификация, план, декомпозиция на задачи, которые читает следующая фаза.

Ведущее в этой фазе — не инструмент, а дисциплина spec-driven: первый артефакт разработки не код, а спецификация, которую человек написал, возможно с помощью AI, прочитал и принял. AI здесь силён, но силён узко: он усиливает структурирование и полноту формулирования намерения, а само намерение — решение, что нужно строить, — остаётся существенной сложностью человека. Инструменты вроде Spec-Kit или plan mode — вторичная иллюстрация того, чем эту дисциплину исполняют. В этом разделе мы разберём саму практику, три рекомендации методик и один характерный провал этой фазы. Держите два вопроса фазы: где AI усиливает — и где человек обязателен.

11 · Требования — первый артефакт, ещё до кода: практика spec-driven ставит между намерением и кодом человеко-ревьюируемую спеку; три голоса индустрии сходятся, что спека — центральный артефакт

Слайд 11. Требования — первый артефакт, ещё до кода: практика spec-driven ставит между намерением и кодом человеко-ревьюируемую спеку; три голоса индустрии сходятся, что спека — центральный артефакт

Первая фаза жизненного цикла и первый узел git-loop. Её ведущая практика — разработка от спецификации: первичный, версионируемый и ревьюируемый артефакт не код, а спецификация, из которой код порождается [3]. Спецификация здесь не бюрократический документ для галочки, а тот самый человеко-владеемый артефакт: то, что система должна делать, с какими ограничениями, в каком порядке; то, что человек прочитал и принял; то, что версионируется как живой Markdown рядом с кодом, а не как мимолётный промпт [2]. Классическая инженерная истина, известная задолго до AI: самые дорогие ошибки — ошибки этой фазы, потому что неверно понятое требование тиражируется через все стадии и всплывает в проде. Ошибка требования на фазе требований стоит переформулировать абзац; в реализации — переписать код; в проде — стоит инцидента плюс потерянного доверия. Эта кривая и делает дисциплину «спека до кода» окупающейся: она ловит недопонимание там, где оно дешевле всего.

Почему именно дисциплина, а не «AI умеет писать требования»? Потому что AI силён в структурировании и полноте формулирования намерения — превратить свободный текст в спеку, задать уточняющие вопросы, выявить пропущенные случаи, — но само намерение, то, что нужно системе, остаётся за человеком [1]. Выявить пропущенный случай — структурная работа, где AI силён; решить, каким должно быть поведение — существенная сложность, где решает человек. Именно поэтому узкое место разработки — не написать код, а точно выразить намерение [4]. Практика spec-driven и есть способ поставить AI в первую роль, а человека во вторую, соблюдая порядок «требования → дизайн → задачи» с малыми проверяемыми единицами [3].

Три голоса индустрии сходятся на том, что спека — центральный артефакт. OpenAI формулирует это через свой Model Spec — живой версионируемый Markdown, открыто опубликованный на GitHub: спека здесь долговечный, ревьюируемый, диффабельный артефакт, а не мимолётные промпты [2]. Sean Grove доводит тезис до провокации: исходная спецификация — вот ценный артефакт, а код — структурированная коммуникация [5]; и сразу оговоримся, чтобы это не унесли как факт: его оценка доли кода в десять-двадцать процентов ценности — риторическая провокация, а не измерение. Martin Fowler говорит то же с другой стороны: узкое место — намерение, точно выразить, что строить, трудно [4]. Три независимых источника, один вывод: центр тяжести сместился с написания кода на дисциплину формулирования намерения в версионируемый артефакт.

Источники: [1] Anthropic — AI-Native SDLC playbook · [2] OpenAI — Model Spec · [3] GitHub — Spec Kit · [4] Fowler — Interrogatory LLM · [5] Grove — The New Code (OpenAI)

12 · Дисциплина, применённая заранее, даёт измеримую разницу: там, где спека-first выстроена под понятный критерий, результат быстр и предсказуем; там, где AI внедряют без спецификации намерения, отказ — статистически ожидаемый исход, а не исключение

Слайд 12. Дисциплина, применённая заранее, даёт измеримую разницу: там, где спека-first выстроена под понятный критерий, результат быстр и предсказуем; там, где AI внедряют без спецификации намерения, отказ — статистически ожидаемый исход, а не исключение

Два примера рядом — не случайное сопоставление, а иллюстрация одного тезиса: результат зависит не от того, использовали AI или нет, а от того, применили ли дисциплину spec-driven заранее. Опубликованный AWS-кейс из области life sciences показывает команду, построившую готовый к продакшену агент для поиска терапевтических мишеней через spec-first воркфлоу — спецификация, пошаговое исполнение по вехам, верификация результата против спеки — и уложившуюся в три недели силами трёх разработчиков. Честная оговорка: это опубликованный вендором кейс-стади, а не независимо аудированное исследование, конкретный клиент анонимизирован — держим как MEDIUM-confidence иллюстрацию дисциплины, применённой осознанно, не как обобщаемый факт.

Для контраста — обратная сторона статистики, с той же осторожностью к источнику. Один агрегированный обзор называет 847 задокументированных внедрений AI-агентов и долю 76%, провалившихся в течение 90 дней; корневой причиной он называет не техническую неспособность модели, а провал спецификации — намерение организации не было специфицировано настолько точно, чтобы его вообще можно было проверить. Методология выборки источником не раскрыта — эту цифру нельзя цитировать как аудированную статистику, только как иллюстрацию направления тезиса. Пара кейсов вместе не совпадение: где дисциплину выстроили заранее под понятный критерий, результат предсказуем и быстр; где решение «применять AI» приняли без спецификации намерения, отказ — статистически ожидаемый исход. Отрасль называет эту дисциплину термином SDD (Spec-Driven Development) — GitHub Spec Kit и AWS Kiro задали мейнстримное значение, и к 2026 году минимум восемь крупных вендоров выпустили собственный вариант практики.

Источники: [1] AWS Kiro — кейс life sciences (фарма/биотех) · [2] Хари Кришнан — «Spec-Driven Development», Manning

13 · Методики дают три рекомендации, как дисциплинированно писать спеку: малые изолированно-тестируемые единицы, интервьюирующий LLM, спека-как-проверка — инструменты исполняют их и вторичны

Слайд 13. Методики дают три рекомендации, как дисциплинированно писать спеку: малые изолированно-тестируемые единицы, интервьюирующий LLM, спека-как-проверка — инструменты исполняют их и вторичны

Дисциплина «требования до кода» — это не «напишите документ побольше». У методик есть конкретные рекомендации двух видов: как требования структурировать и как их вести во времени. Соберём их как практику, а не как набор команд конкретного инструмента.

Сначала структура. Первое — пользовательские истории с проверяемыми критериями приёмки: «как такая-то роль, я хочу такую-то цель, чтобы получить такую-то пользу». Второе — EARS-нотация Мэйвина 2009 года, «Easy Approach to Requirements Syntax»: пять шаблонов, из которых ключевой — «КОГДА триггер, система ДОЛЖНА ответ»; EARS убирает расплывчатые «should/may» и делает требование одновременно проверяемым и читаемым для модели [7]. Третье — явно разделять функциональные требования (что система делает) и нефункциональные (задержка, стоимость, безопасность); нефункциональные потом энфорсятся fitness-функциями, о которых будет отдельный разговор в архитектуре [6]. Четвёртое — принудительный порядок трёх файлов: требования, затем дизайн, затем задачи, с версионированием рядом с кодом [3], а Definition of Done формулируется как малые изолированно-тестируемые единицы: не «сделай аутентификацию», а «создай эндпоинт регистрации, валидирующий формат email».

Теперь процесс. Выявление требований: вместо одного расплывчатого промпта пусть модель интервьюирует вас — Фаулер называет это «Interrogatory LLM»: модель задаёт вопросы и вскрывает невысказанные допущения [4]. Дальше — ревью и sign-off: требования ревьюируются и подписываются человеком до генерации кода, и именно этот accept/reject играет роль «слияния» [1]. Версионирование: требования живут диффабельным Markdown прямо в репозитории рядом с кодом, а не в вики или чате [3]. И синхронизация: требования держат в актуальности так же, как ADR, — устаревшее требование молча гниёт [9]. Сквозной тезис: человек владеет «что строить», AI помогает структурой и полнотой; инструменты, которые всё это исполняют, сменяемы, а несущее — эти рекомендации.

Источники: [1] Anthropic — AI-Native SDLC playbook · [3] GitHub — Spec Kit · [4] Fowler — Interrogatory LLM · [6] Thoughtworks — fitness function · [7] Mavin — EARS-нотация (IEEE RE'09) · [9] Nygard — ADR

14 · Визуализация требований — не новая категория, а тот же принцип architecture-as-code, применённый к требованиям: держать артефакт текстом, а не картинкой, чтобы он версионировался и читался и человеком, и AI

Слайд 14. Визуализация требований — не новая категория, а тот же принцип architecture-as-code, применённый к требованиям: держать артефакт текстом, а не картинкой, чтобы он версионировался и читался и человеком, и AI

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

Mermaid — текстовый DSL для диаграмм, то же семейство инструментов, что PlantUML и Structurizr: диаграмма описывается кодом, а не рисуется мышью, что автоматически даёт версионирование средствами git, а не отдельного визуального редактора [1]. User Journey Diagram — конкретный тип диаграммы для требований: структура «заголовок, затем секции-фазы пути, затем задачи-шаги с оценкой удобства от одного до пяти и вовлечёнными действующими лицами» показывает, какие шаги проходит пользователь, чтобы выполнить задачу, — обнажает точки, требующие улучшения. Практическое следствие то же, что у C4-как-код: AI может и читать такую диаграмму как контекст требования, и порождать её из описания сценария тем же способом, каким читает и пишет C4-диаграмму, потому что формат один и тот же.

Второй, более прямой аналог — сценарий Given-When-Then на Gherkin, который не просто описывает поток, а проверяется прогоном автотеста, разберём подробнее в разделе тестирования [2]. Параллель: как C4 и Mermaid — текст, проверяемый drift-детектором, так Gherkin-сценарий — текст, проверяемый автотестом; оба — спецификация как исполняемый артефакт, версионируемая рядом с кодом, и оба AI может как писать, так и валидировать на расхождение с реальностью.

Честная граница: user story mapping — раскладка пользовательских активностей по колонкам, часто на физической или цифровой стене — важная и распространённая практика, но это воркшоп-техника фасилитации, а не code-as-DSL. Смешивать её с Mermaid и Gherkin в одну категорию «требования как код» было бы преувеличением: путь story mapping к дисциплинированному требованию лежит через людей в комнате, обсуждающих стикеры, а не через версионируемый текстовый формат, который читает и порождает AI.

Источники: [1] Mermaid — User Journey синтаксис · [2] Cucumber — BDD/Gherkin документация

15 · prompt-and-pray — не «плохой инструмент», а пропуск дисциплины: модель молча достраивает требования дефолтами; корень провала — существенная сложность намерения (Brooks), которая не делегируется

Слайд 15. prompt-and-pray — не «плохой инструмент», а пропуск дисциплины: модель молча достраивает требования дефолтами; корень провала — существенная сложность намерения (Brooks), которая не делегируется

Разберём главный режим отказа фазы требований как отдельный блок. Антипаттерн начинающего — prompt-and-pray, «промпт и молись»: дать модели один короткий расплывчатый промпт «сделай мне систему бронирования» и надеяться на результат. Это не «плохой инструмент», а пропуск дисциплины: нет артефакта-спеки, нет человеческого чекпойнта между намерением и кодом. Не имея спецификации, модель вынуждена молча достраивать десятки решений — можно ли бронировать в прошлом, что делать при пересечении двух броней, кто вправе отменить чужую бронь, как быть с часовыми поясами — и по каждому берёт правдоподобный дефолт, который выглядит разумно, но может не совпадать с тем, что нужно организации.

И вот что коварно: система работает на демо и ломается на первом реальном конфликте броней, при этом код корректен относительно того, что модель предположила. Баг не в коде, а в том, что предположения никто не проверил. Отладка тут не помогает — чинить надо не реализацию, а несформулированное требование, а его в коде не видно. Диагноз, который дали сами методологи спека-first: узкое место — не способность модели писать код, а точность формулирования намерения [1], то есть существенная сложность по Бруксу, которая инструменту не делегируется [1].

Отсюда правильная альтернатива prompt-and-pray — не «не использовать AI», а вернуть человеческий чекпойнт: требования до кода, спецификацию, которую человек прочитал и принял, прежде чем что-либо генерируется [2]. Ровно этот приём — вместо «промпт и молись» модель сначала задаёт уточняющие вопросы и вскрывает невысказанные допущения, а человек согласует их до генерации [2]. Разница между prompt-and-pray и дисциплиной — не «с AI или без AI», а «человек проверил намерение до кода или не проверил».

Источники: [1] Brooks — No Silver Bullet · [2] Fowler — Interrogatory LLM

16 · Архитектура · после требований — архитектура, не сразу код; несущее — человеческая практика, ею надо управлять с AI, а не делегировать её AI

Слайд 16. Архитектура · после требований — архитектура, не сразу код; несущее — человеческая практика, ею надо управлять с AI, а не делегировать её AI

Вторая фаза — архитектура и дизайн, и здесь важно сразу поправить типичную ошибку прошлой версии материала. Дело не в том, что «у AI нет архитектурного продукта», а в том, что после требований идёт отдельная обязательная фаза — решить, из чего собрать систему, — и её нельзя пропустить, перепрыгнув сразу к коду.

Архитектура — тонкая фаза для AI, но тонкая не потому, что «AI не дорос», а по природе задачи: архитектурное решение — это выбор под компромисс, опирающийся на контекст вне кода, то есть существенная сложность по Бруксу. Поэтому ведёт здесь человеческая практика, а AI полезен на периферии — сгенерировать варианты, объяснить паттерн, набросать диаграмму. Но и оставлять фазу «в головах» нельзя: у нас есть зрелые практики управлять архитектурой с AI — записи архитектурных решений, fitness-функции, архитектура-как-код. В этом разделе мы разберём, зачем фаза обязательна, какими практиками ею управляют, и один характерный провал — отравленный контекст, который наступает ровно тогда, когда этих практик нет.

17 · После требований — архитектура, а не сразу код: «решить, что строить» — существенная сложность (Brooks); пропуск фазы даёт эрозию и когнитивный долг

Слайд 17. После требований — архитектура, а не сразу код: «решить, что строить» — существенная сложность (Brooks); пропуск фазы даёт эрозию и когнитивный долг

Между «что нужно», то есть требованиями, и «как писать», то есть кодом, лежит отдельный узел — «из чего собрать», архитектура. Это самостоятельная фаза, которую нельзя пропускать, перепрыгнув сразу к коду. Продукт этой фазы — не тонны диаграмм, а малое число трудных и труднообратимых развилок: где границы компонентов, какая модель данных, что приоритетнее — скорость, стоимость или надёжность, на какие ключевые зависимости мы опираемся. Каждая такая развилка опирается на контекст, которого нет в коде: бизнес-ограничения, компромиссы между сторонами, будущие планы.

Именно поэтому «решить, что строить» — существенная сложность по Бруксу, и выбор под компромисс не делегируется [1]. AI здесь полезен, но на периферии: сгенерировать несколько вариантов, объяснить незнакомый паттерн, набросать черновик диаграммы. Решение же остаётся человеческим, потому что это выбор под компромисс с необратимыми последствиями [1].

Что происходит, если фазу пропустить и сразу писать код? Возникает эрозия архитектуры — растущий разрыв между тем, что задумывалось, и тем, что реализовано; систему становится всё труднее сопровождать. Thoughtworks Radar дал родственному, обострённому AI явлению точное имя — когнитивный долг кодовой базы, и поместил его в кольцо Hold, то есть «остановитесь» [2]. Смысл в том, что устройство системы расходится с пониманием команды: как всё устроено, живёт в головах, а не в артефактах, и с уходом людей знание теряется [2]. Показательно, что средство против когнитивного долга, которое называет тот же Radar, — архитектурные fitness-функции: объективная автоматическая проверка архитектурной характеристики на каждом коммите [3]. То есть проблема пропуска архитектуры лечится архитектурной практикой, а не «лучшим инструментом» [3]. Вывод фазы: архитектуру нельзя пропустить и нельзя делегировать AI; ею надо управлять с AI через явные практики.

Источники: [1] Brooks — No Silver Bullet · [2] Thoughtworks — Technology Radar · [3] Thoughtworks — architectural fitness function

18 · Управлять архитектурой с AI можно четырьмя практиками: ADR (durable-контекст), fitness-функции (надзор на каждом коммите), C4/архитектура-как-код (машиночитаемая), эволюционная архитектура — инструменты вторичны

Слайд 18. Управлять архитектурой с AI можно четырьмя практиками: ADR (durable-контекст), fitness-функции (надзор на каждом коммите), C4/архитектура-как-код (машиночитаемая), эволюционная архитектура — инструменты вторичны

Архитектурой не только нельзя пренебрегать — ею можно и нужно управлять с AI через четыре зрелые практики, и инструменты здесь вторичны. Первая — записи архитектурных решений, ADR. Это короткая, около полстраницы, неизменяемая запись на каждое значимое решение по формату Нюгарда: контекст, решение, статус, последствия, хранимая в системе контроля версий рядом с кодом [1]. Зачем это критично в AI-native: код хранит, что сделано, git — когда и кто, но «почему приняли именно это решение» не хранит ничто, кроме ADR, — а «почему» и есть тот человеко-написанный контекст, которого у stateless-агента нет и который переживает его сессии [1]. Важный провал: писать ADR нельзя поручать модели — по diff она реконструирует правдоподобное объяснение постфактум, часто выдумывая обоснование, и такой пустой ADR потом отравляет следующего агента. Автор развилки — автор ADR; AI редактирует и сверяет, человек решает и обосновывает.

Вторая практика — архитектурные fitness-функции: автоматическая объективная проверка архитектурной характеристики на каждом коммите, например «модуль оплаты не зависит от интерфейса», «ответ укладывается в двести миллисекунд», «покрытие контракта не падает» [2]. Ключевое свойство — объективность: как формулирует Ребекка Парсонс, соавтор «Building Evolutionary Architectures», «мы с вами никогда не поспорим, прошла она или нет» [2]. По сути это детерминированный гейт, энфорсящий «почему» из ADR; и связь с AI двойная — AI удобно писать сами fitness-функции, а они удобно валидируют сгенерированный им код [2].

Третья практика — держать архитектуру машиночитаемо и версионируемо. Язык описания — C4 Саймона Брауна с четырьмя уровнями зума: контекст, контейнер, компонент, код [3]. Архитектура-как-код означает описывать структуру текстом, который версионируется и диффается, а не рисовать картинки; тогда AI читает архитектуру как контекст, порождает валидные диаграммы и, главное, выполняет drift-detection — сравнивает описанную модель с фактическим кодом и ловит расхождение [3]. Четвёртая практика объединяет первые три — эволюционная архитектура Форда, Парсонс и Кюа. Суждение раздела: устойчивый паттерн — автоматическая архитектурная governance на каждом коммите [4]; вендорский хайп — обещание, что какой-то продукт сам обеспечит вам архитектуру. Человек владеет «почему», AI кодирует и проверяет.

Источники: [1] Nygard — ADR · [2] Ford/Parsons — Evolutionary Architectures · [3] Brown — C4 · [4] Thoughtworks — Technology Radar

19 · У каждой из четырёх практик управления архитектурой есть конкретный артефакт в репозитории и конкретный шаг сборки, который краснеет при нарушении: ADR-запись, тест-инвариант, текстовая модель C4 и конвейер, держащий три предыдущих вместе

Слайд 19. У каждой из четырёх практик управления архитектурой есть конкретный артефакт в репозитории и конкретный шаг сборки, который краснеет при нарушении: ADR-запись, тест-инвариант, текстовая модель C4 и конвейер, держащий три предыдущих вместе

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

ADR — короткая, в полстраницы, запись на одну архитектурную развилку: контекст (какую проблему решаем, какие силы действуют), решение в утвердительной форме, статус и последствия, включая негативные [1]. Найгард настаивал именно на лёгкости формата: большие документы никогда не поддерживаются в актуальном состоянии, у малых модульных есть хотя бы шанс. Запись неизменяема — устаревшее решение не переписывают, а помечают заменённым новой записью. Для агента, у которого нет памяти между запусками, ADR оказывается тем единственным местом, где хранится «почему»: код показывает, что изменилось, история версий — когда и кто, а обоснование не хранит больше ничто.

Fitness-функция переводит это «почему» в машинную проверку на каждом коммите: направление зависимостей между модулями, бюджет задержки критичного пути, покрытие контракта [2]. Её ценность ровно равна ценности инварианта, который в неё вложил человек, — тривиальный всегда-зелёный гейт даёт только видимость надзора.

Архитектура-как-код — та же логика, применённая к самой модели системы: текстовый язык описания, который версионируется и диффается рядом с кодом, поэтому AI одинаково хорошо его и читает, и порождает, а сверка описанной модели с фактическим кодом ловит расхождение до слияния [3].

Четвёртая колонка — не отдельный артефакт, а сборка трёх предыдущих: эволюционная архитектура складывается из инкрементальных изменений, явных fitness-функций и спроектированной способности систему менять [4]. В репозитории это выглядит как один конвейер, прогоняющий три проверки вместе.

Источники: [1] Найгард — ADR · [2] Thoughtworks — architectural fitness function · [3] Браун — C4 + Structurizr DSL · [4] Форд, Парсонс, Кюа — Эволюционные архитектуры

20 · Отравленный контекст: AI копирует плохие примеры кодбазы и усиливает их — но так работает, когда архитектура не описана и нет процесса управления ею; альтернатива — ADR + fitness-функции

Слайд 20. Отравленный контекст: AI копирует плохие примеры кодбазы и усиливает их — но так работает, когда архитектура не описана и нет процесса управления ею; альтернатива — ADR + fitness-функции

У тонкости AI в архитектуре есть конкретный наблюдаемый механизм, а не только абстрактный Брукс. Биргитта Бёкелер из Thoughtworks назвала его отравленным контекстом: AI-ассистент ведёт себя как тот разработчик, который копирует из плохих примеров кодовой базы [1]. Механизм такой: модель генерирует, опираясь на то, что видит в контексте, — на существующий код проекта. Если в проекте уже есть архитектурные проблемы — дублирование, обходные пути, устаревшие паттерны, — AI воспроизводит и усиливает их, потому что для него это «как принято в этом проекте», а не «то, чего надо избегать» [1]. Возникает петля: плохой дизайн, AI копирует, дизайн становится хуже, AI копирует ещё увереннее [1]. Бёкелер честно признаёт: хорошего способа это смягчить на уровне модели пока нет.

И вот критичная оговорка, ради которой мы этот слайд переработали. Отравленный контекст — не свойство «AI вообще», а следствие отсутствия практики. Он наступает именно тогда, когда архитектура не описана и нет процесса управления ею: нет ADR, нет fitness-функций, нет машиночитаемой модели. Там, где практики предыдущего слайда выстроены, петля разрывается: разделяемое человеко-написанное понимание «почему» в ADR лишает AI повода тиражировать «как сложилось» [2], а детерминированные инварианты fitness-функций автоматически ловят самозакрепление плохого дизайна на каждом коммите [3]. Поэтому это не аргумент «AI нельзя подпускать к коду», а аргумент «сначала практика управления архитектурой, потом AI внутри неё».

Отсюда конкретная человеко-центричная альтернатива, прямо продолжающая предыдущий слайд. Во-первых, человек владеет архитектурой и способен на то, чего AI по построению не делает: посмотреть на паттерн и сказать «так у нас сложилось, но это неправильно». Во-вторых, фиксировать решения явно через ADR — человеко-написанный контекст, снижающий риск отравления [2]. В-третьих, fitness-функции как детерминированные инварианты ломают петлю автоматически [3], а модульный код даёт AI управляемый контекст. И заметьте: векторный поиск и RAG не решают архитектуру — они улучшают осведомлённость модели о том, как код есть, но осведомлённость о том, как есть, не то же, что суждение о том, как должно быть.

Источники: [1] Thoughtworks — Exploring Gen AI (Böckeler) · [2] Nygard — ADR · [3] Thoughtworks — fitness function

21 · Реализация · сильная фаза при трёх практиках: малые проверяемые единицы, постоянный слой памяти в репозитории, детерминированный харнес вокруг модели

Слайд 21. Реализация · сильная фаза при трёх практиках: малые проверяемые единицы, постоянный слой памяти в репозитории, детерминированный харнес вокруг модели

Третья фаза — реализация, и это самая заметная фаза: именно здесь AI пишет код и здесь измерено больше всего. Фаза сильная, но сильная при дисциплине — и в этом разделе мы разложим её на три разные, не пересекающиеся практики, чтобы не свалить всё в «пиши код с ассистентом».

Первая практика — дисциплина самой работы: как дробить задачу и вести её циклом. Вторая — организация среды: что живёт в репозитории постоянно и что агент читает каждую сессию. Третья — харнес-инжиниринг: детерминированный каркас проверок вокруг недетерминированной модели. Это три разных среза одной фазы, и путать их нельзя: первый про то, как работать, второй про то, что хранить, третий про то, чем проверять. А дальше — два провала фазы: семидесятипроцентная проблема и вендорский анти-хайп, где бренд и бенчмарк подменяют дисциплину.

22 · Дисциплина работы — дробить задачу на малые проверяемые единицы и вести её циклом explore → plan → code → commit; две философии (в редакторе / асинхронно) — вторично

Слайд 22. Дисциплина работы — дробить задачу на малые проверяемые единицы и вести её циклом explore → plan → code → commit; две философии (в редакторе / асинхронно) — вторично

Первая практика фазы реализации — дисциплина самой работы, и ведёт здесь не инструмент, а порядок действий. Anthropic формулирует его явно как цикл explore → plan → code → commit, но это общая методика, а не фича одного продукта [1]: сначала исследовать код и понять контекст, потом принять план, потом писать, потом фиксировать. Порядок принудителен: если начать с генерации, минуя исследование и план, это тот же prompt-and-pray, только на уровне кода — модель достроит недостающее понимание догадками [1].

Вторая половина этой практики — малые проверяемые единицы. Каждый кусок работы должен быть таким, чтобы его можно было реализовать и проверить в изоляции. У этого два адресата. Для AI малая единица — детерминированный способ проверить свою работу: есть тест, он либо прошёл, либо нет. Для человека малый diff — единственный формат, который он реально прочитает: как замечает Addy Osmani, чем меньше предложение AI, тем реальнее ревью, а гигантский change-set человек пролистывает, не вникая, и тогда контроль только на бумаге [2].

И заметьте распределение ролей внутри практики: AI берёт на себя привнесённую сложность — шаблонный код, типовой обработчик, — а человек несёт существенную: что мы строим, что здесь рискованно, корректен ли результат и можно ли его слить [3]. Это прямое следствие Брукса: инструмент снимает привнесённую сложность, но существенная остаётся за человеком [3]. Есть ещё разрез по режиму участия — AI работает либо в редакторе, синхронно, с человеком в цикле, либо асинхронно, в изолированном окружении, отдавая на выходе pull request. Но это свойство режима, вторичное по отношению к дисциплине цикла, и мы вернёмся к нему в анти-хайп-блоке. Несущее здесь одно: дробить на малые проверяемые единицы и вести их циклом explore–plan–code–commit — это дисциплина, которая удерживает AI в зоне реального человеческого контроля.

Источники: [1] Anthropic — AI-Native SDLC playbook · [2] Osmani — The 70% Problem · [3] Brooks — No Silver Bullet

23 · Пропущенный шаг саморевью стоит конкретно: Gemini CLI не проверил результат mkdir и на основе ложного допущения перезаписал файлы пользователя цепочкой move — цена не гипотетическая, а задокументированная

Слайд 23. Пропущенный шаг саморевью стоит конкретно: Gemini CLI не проверил результат mkdir и на основе ложного допущения перезаписал файлы пользователя цепочкой move — цена не гипотетическая, а задокументированная

Цена пропущенной проверки — не гипотетическая, а конкретно задокументированная. Google Gemini CLI, июль 2025: пользователь попросил переместить файлы в новую папку; агент выполнил команду создания директории, но не проверил её результат — не было проверки прочитанного после записи. На основании этого ошибочного допущения агент решил, что целевая папка уже существует, и последующая цепочка операций перемещения перезаписала почти все файлы пользователя в один оставшийся файл. Реакция модели стала показательной цитатой: она сама признала «катастрофический провал» и «грубую некомпетентность».

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

Для масштаба, не для замены урока, — контраст с системным уровнем: у Uber в 2026 году около одиннадцати процентов живых бэкенд-обновлений выкатываются агентом вообще без человека в цикле. Один пример — цена одного пропущенного check на уровне пользователя; другой — масштаб, на котором тот же класс риска действует, когда AI внедряют широко без равной по строгости дисциплины проверки. Практический вывод: явный шаг «перечитать весь diff целиком, задать себе вопросы будущего ревьюера» перед commit — часть дисциплины цикла, а не факультативная привычка, которую пропускают, если код написан быстро.

Источники: [1] AI Incident Database — Report 6120 / Incident 1178

24 · Контекст агента живёт на четырёх разных уровнях — постоянные инструкции, контекст одной сессии, операционная история задач и память (слот 1 карты Лекции 3), — и каждый ведут по-своему: инструкции пишут, сессию курируют, историю датируют, память настраивают и проверяют

Слайд 24. Контекст агента живёт на четырёх разных уровнях — постоянные инструкции, контекст одной сессии, операционная история задач и память (слот 1 карты Лекции 3), — и каждый ведут по-своему: инструкции пишут, сессию курируют, историю датируют, память настраивают и проверяют

Агент stateless: между запусками он не помнит ничего. Поэтому всё, что он должен знать о проекте, лежит не в промпте, а на одном из четырёх уровней — и путать их дорого, потому что ведут их по-разному.

Уровень 1 — постоянные инструкции: статичный файл AGENTS.md в корне репозитория (у Anthropic аналог называется CLAUDE.md), который агент перечитывает каждую сессию [1]. Ключевая рекомендация — вести его командами, а не объяснениями: «Запустить тесты: pnpm test» работает, а «мы используем такую-то систему сборки» заставляет агента выдумывать шаги настройки. Пишет и обновляет этот файл человек, а живёт он ровно столько, сколько живёт репозиторий.

Уровень 2 — контекст одной сессии, то есть управление окном текущего диалога. Примитивов три: JIT-извлечение, компакция, заметки [3]. JIT-извлечение стоит расшифровать явно: агент открывает конкретный файл в тот момент, когда задача его потребовала, а не загружает весь репозиторий в начало сессии. Курируют не ради экономии токенов: исследование Chroma на восемнадцати моделях показало, что точность извлечения падает нелинейно с ростом входа, причём деградация начинается до переполнения окна [2].

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

Уровень 4 — память как отдельная система: Mem0, Cognee, Graphiti, Letta. Её не правят построчно, как файл: она накапливается сама, поэтому её организуют и периодически проверяют.

Отсюда практический вывод про распределение. README отвечает человеку, зачем проект. AGENTS.md — агенту, какие команды исполнять буквально. ADR — почему выбрали решение. Комментарий в коде — почему неочевиден именно этот кусок. Разбор инцидента — как чинили в прошлый раз. Класть контекст надо туда, где его перечитают вместе с кодом.

Источники: [1] agents.md — открытый стандарт · [2] Chroma — Context Rot (18 моделей) · [3] Anthropic — context engineering

25 · У каждого из четырёх уровней контекста свой предел: устаревшие инструкции хуже их отсутствия, компакция теряет решения молча, а JIT не спросит о неизвестном, операционная история стареет тише инструкций, память закрепляет ошибочный вывод — риск не исчезает, а меняется на другой

Слайд 25. У каждого из четырёх уровней контекста свой предел: устаревшие инструкции хуже их отсутствия, компакция теряет решения молча, а JIT не спросит о неизвестном, операционная история стареет тише инструкций, память закрепляет ошибочный вывод — риск не исчезает, а меняется на другой

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

Уровень 1, постоянные инструкции. Режим отказа здесь хуже, чем просто отсутствие файла: и агент, и человек доверяют артефакту, который перестал описывать реальный проект. Отсутствие файла агент компенсирует вопросом или разведкой по репозиторию, а устаревшему следует буквально. Конкретно: файл предписывает команду сборки, которую давно заменили другой, — агент упрямо гоняет её, получает непонятную ошибку окружения и тратит ходы на диагностику несуществующей проблемы, хотя актуальную команду нашёл бы поиском за секунды.

Уровень 2, контекст одной сессии. Компакция — это суммаризация, а суммаризация по определению с потерями: если в диалоге было явно принято решение не использовать библиотеку X из-за лицензионного конфликта, а модель при сжатии сочла деталь второстепенной, решение исчезает молча. Никакой ошибки не возникает — агент просто через несколько ходов предлагает именно то, от чего только что отказались. JIT-извлечение страдает симметрично с другой стороны того же компромисса: агент подгружает то, о чём догадался спросить, а о существовании чего он не знает — не запросит никогда [1].

Уровень 3, операционная история. Файл инструкций один, и его перечитывают вместе с проектом при каждом ревью; архив разборов — десятки отдельных документов, и стареет он незаметно. Агент находит документ по релевантности запроса, а не по актуальности, и предлагает обходной путь проблемы, закрытой полгода назад.

Уровень 4, память. Она накапливается сама, поэтому вычитывать её построчно нельзя. Ошибочное убеждение, однажды удержанное и читаемое только самим агентом, воспроизводится в каждой следующей сессии — снаружи нужна периодическая проверка, а не построчная правка. Отсюда правило распределения: то, что нельзя потерять молча, фиксируют на уровне 1.

Источники: [1] Anthropic — context engineering

26 · Харнес — детерминированный каркас-гейт вокруг недетерминированной модели (линтеры, структурные тесты, гейты, least-privilege, sandbox): агент буксует → сигнал → фидбек; честно — харнес сам не проверяет поведение

Слайд 26. Харнес — детерминированный каркас-гейт вокруг недетерминированной модели (линтеры, структурные тесты, гейты, least-privilege, sandbox): агент буксует → сигнал → фидбек; честно — харнес сам не проверяет поведение

Третья практика фазы — харнес-инжиниринг, и это ещё один отдельный срез, который нельзя путать с первыми двумя. Первая была про то, как работать, вторая — про то, что хранить, эта — про то, чем проверять. Биргитта Бёкелер из Thoughtworks формулирует главную идею так: надёжная AI-разработка достигается не тем, что мы даём модели больше свободы, а тем, что сужаем пространство её решений явной структурой и верификацией [1]. Причина в природе модели: она недетерминирована — один и тот же промпт даёт разные ответы, часть которых правдоподобно-неверны. А харнес детерминирован: тест либо проходит, либо нет, линтер либо ругается, либо нет. Мы окружаем недетерминированное ядро детерминированной упряжью — линтеры, структурные тесты, управление энтропией, плюс периметр безопасности: наименьшие привилегии, изолированное окружение, pull request как обязательный гейт [1].

Главный механизм харнеса — петля через сбой. Когда агент буксует, это не повод ругать модель, а диагностический сигнал о дыре в каркасе: не хватило команды сборки — добавьте её в AGENTS.md; агент нарушил архитектурный инвариант — напишите fitness-функцию, которая будет ловить это на каждом коммите [3]; сгенерировал небезопасный код — поставьте SAST-гейт. Каркас растёт из реальных провалов, а хорошая практика — собрать evals из двадцати-пятидесяти задач своего багтрекера.

И теперь честное ограничение, ради которого этот слайд стоит в бакете провалов: guardrails не равны верификации. Каркас, как говорит Бёкелер, не содержит проверки функциональности и поведения — линтер знает, что код отформатирован, но не знает, решает ли он правильную задачу [1]. Отсюда вывод фазы: работают три слоя, и ни один не заменяет другой — харнес держит форму, поведенческие тесты проверяют поведение, человек отвечает за merge. Именно про этот последний слой резко высказывается Саймон Уиллисон, автор термина «vibe-engineering»: если код не отревьюен человеком, это ещё не разработка [2] — ответственность за слияние не передаётся ни харнесу, ни модели [2].

Источники: [1] Thoughtworks — Exploring Gen AI (Böckeler) · [2] Willison — Vibe engineering · [3] Thoughtworks — fitness function

27 · Skill — процедура, которую агент подгружает on-demand, а не всегда: AGENTS.md держит короткое и частое, skill — длинное и редкое, цена которого равна нулю, пока не вызван

Слайд 27. Skill — процедура, которую агент подгружает on-demand, а не всегда: AGENTS.md держит короткое и частое, skill — длинное и редкое, цена которого равна нулю, пока не вызван

Постоянный слой инструкций — AGENTS.md — агент читает каждый ход, и платить за него контекстом приходится всегда, даже если инструкция нужна раз в квартал. Skill решает ровно этот компромисс: это папка с файлом SKILL.md, которая подгружается только тогда, когда задача ей соответствует. До вызова она не стоит почти ничего.

Вопрос важнее механики: что в разработке действительно имеет смысл выносить в skill. Практика сводится к трём узнаваемым типам. Первый — прогон проверок одной командой: линтер, проверка типов и тесты конкретного репозитория вызываются единым обращением, а не восстанавливаются агентом заново по обрывкам конфигурации. Второй — одноразовая база под интеграционный тест: как поднять настоящий Postgres или Kafka в контейнере на время прогона и погасить после. Третий — сборка документации по коду: пройти структуру проекта и зависимости, собрать README и записи об архитектурных решениях. Профиль у всех трёх один: шагов много, нужно редко.

Граница важна не меньше списка. Skill не нужен, если процедура требуется каждый ход — её место в AGENTS.md; если задача разовая — достаточно попросить в чате; если это один факт, а не последовательность шагов — хватит строки в инструкциях. Отдельно вредны skill'ы «обо всём сразу»: агент выбирает skill по описанию, и размытое описание он либо не найдёт вовремя, либо применит не к месту. То же правило независимо сформулировано в свежей работе по инженерии ПО: один skill — одна цельная, узнаваемая по описанию способность.

Формат заявлен как открытый стандарт и подтверждён у Codex CLI, но у Cursor слоя «по требованию» нет — там правила, активные всегда. Фразу «инструмент поддерживает skills» стоит уточнять, а не принимать на слово.

Источники: [1] Agent Skills — открытый стандарт · [2] Claude Docs — Skills · [3] Destefanis — Authoring Agent Skills (arXiv:2607.25032)

28 · MCP убирает человека-моста между агентом и внешними системами (issue-трекер, браузер, деплой): сервер публикует инструменты, агент вызывает их как встроенные — но тот же канал закрывает сразу два угла Lethal Trifecta

Слайд 28. MCP убирает человека-моста между агентом и внешними системами (issue-трекер, браузер, деплой): сервер публикует инструменты, агент вызывает их как встроенные — но тот же канал закрывает сразу два угла Lethal Trifecta

Без MCP агент видит только файлы рабочей копии и терминал. Этого хватает для кода, но не для того, что лежит вне репозитория: трекер задач, живой браузер, система сборки. Пока моста нет, мостом работает инженер — переносит данные руками. MCP убирает мост: сервер при подключении публикует список своих инструментов, и агент вызывает их тем же циклом, что и встроенные.

У этого есть цена, о которой говорят реже. Сервер публикует не весь интерфейс системы, а отобранный набор инструментов. Чего в наборе нет — агенту недоступно, даже если сама система это умеет: набор инструментов GitHub MCP — подмножество того, что доступно через API GitHub и через команду gh в терминале. Плюс каждая схема инструмента занимает контекст постоянно, с момента подключения, а не по вызову. Поэтому там, где у агента уже есть терминал, узкая команда часто дешевле MCP-вызова, а активный набор серверов стоит держать минимальным.

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

Закрывается это тремя шагами, и порядок в них существенен. По умолчанию — только чтение: инструменты записи пропускаются, даже если агент их запросил. Запись открывают под конкретную задачу отдельным решением, а не настройкой из коробки. И чем меньше серверов подключено, тем меньше и углов тройки, и постоянного контекста.

Источники: [1] GitHub MCP server · [2] Playwright MCP server (Microsoft) · [3] Willison — the lethal trifecta

29 · Нет единственно правильного паттерна логирования задач — выбор составной: solo/команда × длительность задачи × нужда в аудит-следе; встроенный TodoWrite/Task* — session-scoped прогресс, не замена персистентному файловому логу

Слайд 29. Нет единственно правильного паттерна логирования задач — выбор составной: solo/команда × длительность задачи × нужда в аудит-следе; встроенный TodoWrite/Task* — session-scoped прогресс, не замена персистентному файловому логу

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

Самый простой — один файл, общий хронологический лог: всё, что происходило, пишется подряд. Он даёт цельную картину «что и когда» и хорошо читается человеком, но в команде становится узким местом — все правят одно и то же место, и конфликты слияния идут постоянно. Следующий шаг — папка, в которой на каждую задачу заводится один файл. Конфликтов заметно меньше: разные люди пишут в разные файлы. Гранулярность здесь выбрана не произвольно: открытый проект Backlog.md привязывает размер файла к правилу «одна задача — одно контекстное окно — одна заявка на слияние», чтобы изменения оставались того размера, который человек способен прочитать целиком. Самый развесистый вариант — своя папка на задачу с несколькими файлами внутри: только он даёт детальный след промежуточных шагов, нужен на долгих сложных задачах и заметно плодит директории.

Выбор определяют три вопроса: кто работает — один человек или команда; как долго живёт задача; зачем нужен след — восстановить хронологию, отчитаться или разобрать ход рассуждения.

Есть и четвёртый вариант, не файловый: вести операционный лог в трекере — Jira, Linear, GitHub Issues. Плюсы реальные: он виден нетехническим участникам, ложится в уже принятый процесс команды и не засоряет репозиторий. Минус конкретный: трекер лежит вне файлового контекста агента, и чтобы агент его читал, нужен мост через MCP или API — лишняя внешняя зависимость и сетевой вызов вместо локального чтения файла.

Отдельно стоит различать то, что логом задач не является: встроенные списки дел живут внутри одной сессии и не переживают её, а история коммитов как единственный лог — рабочий, но нигде не формализованный подход.

Источники: [1] Backlog.md — открытый проект · [2] Claude Docs — best practices (Task-инструменты)

30 · То, что не записано в steering-файле, агент не знает и угадывает заново каждую сессию — это касается и git: Conventional Commits + Conventional Branch (с AI Agent Source Prefixes) + структурный PR-шаблон превращают объём агентных коммитов из шума в машинно-читаемый сигнал

Слайд 30. То, что не записано в steering-файле, агент не знает и угадывает заново каждую сессию — это касается и git: Conventional Commits + Conventional Branch (с AI Agent Source Prefixes) + структурный PR-шаблон превращают объём агентных коммитов из шума в машинно-читаемый сигнал

Сам git безразличен к тому, что написано в сообщении коммита и как названа ветка: он ничего из этого не проверяет. Конвенция — не требование инструмента, а добровольная договорённость команды, записанная там, где её видят все, включая агента. Записанной её делает AGENTS.md: правило, живущее только в голове разработчика, агент прочитать не может.

Смысл каждой из трёх договорённостей стоит понимать отдельно от синтаксиса.

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

Ветка. Тип задачи, косая черта, короткое описание строчными буквами, а для веток агента — отдельные приставки. Имя ветки — единственное, что ревьюер видит до того, как открыл изменения. Приставка сразу говорит, что ветку вёл агент, и на такие ветки можно повесить отдельное правило проверки. Без договорённости список веток превращается в «test2» и «fix-final».

Описание заявки на слияние. Фиксированный набор разделов: зачем, что изменилось, что не трогали, чем проверено, риски, что отложено. Ревьюер тратит время на проверку, а не на восстановление замысла. Больше всего экономит раздел «что не трогали» — он снимает необходимость искать побочные эффекты там, где их не было. Шаблон агент заполняет по ходу работы, а не вспоминает в конце.

Правило, общее для всех трёх: агент никогда не коммитит прямо в общую ветку — каждая задача получает свою.

Источники: [1] Conventional Commits v1.0.0 · [2] Conventional Branch v1.1.0

31 · «Ignored by git» и «ignored by Claude Code» — две разные вещи, управляемые разными конфиг-файлами: Claude Code читал .env вопреки и .gitignore, и .claudeignore, а Bash-подпроцесс обходит даже явный deny-запрет на чтение

Слайд 31. «Ignored by git» и «ignored by Claude Code» — две разные вещи, управляемые разными конфиг-файлами: Claude Code читал .env вопреки и .gitignore, и .claudeignore, а Bash-подпроцесс обходит даже явный deny-запрет на чтение

Даже такая, казалось бы, решённая дисциплина, как «секреты не коммитим», имеет практическую дыру именно в агентном контексте. The Register 28 января 2026 года независимо задокументировал и верифицировал: Claude Code, проверено на версии v2.1.12, читает файлы .env с секретами, даже когда они явно перечислены и в .gitignore, и в .claudeignore — инструмент выводит предупреждение, что файл содержит credentials, но всё равно печатает их содержимое. На дату публикации — минимум четыре открытых issue на GitHub. Ключевая формулировка источника разрушает интуитивное, но неверное допущение: «ignored by git» и «ignored by Claude Code» — две разные вещи, управляемые разными конфигурационными файлами. То, что файл исключён из версионирования, не означает, что агент его тоже не тронет — git-игнор и agent-файловый-доступ — независимые системы с независимыми политиками.

Практическая, но честно неполная митигация — правило permissions.deny в настройках агента блокирует встроенный инструмент чтения файлов. Но у неё есть конкретный, проверяемый предел: правило deny на Read не блокирует Bash-подпроцессы — команда cat .env, выполненная через Bash, обходит правило, потому что оно применяется к конкретному file-tool, а не ко всем способам чтения файла. Реальное закрытие дыры требует OS-level sandboxing — ограничения на уровне процесса, применяющегося ко всем субпроцессам агента.

Базовая защита строится в три слоя разной строгости: Gitleaks как rule-first pre-commit-сканер — быстрый, но обходимый флагом --no-verify; тот же Gitleaks плюс TruffleHog в verified-режиме на каждый PR в CI — уже обязывающий гейт, потому что CI не обойти; и server-side push-protection на стороне git-хостинга — устойчив даже к обходу клиентских hook'ов. Урок: конвенция, что коммитить, и политика, что агенту разрешено читать, — два разных контракта.

Источники: [1] The Register — Claude Code читает .env вопреки .gitignore · [2] Gitleaks — rule-first сканер секретов · [3] TruffleHog — verification-first сканер

32 · Несколько параллельных агентных сессий над одним репозиторием портят незакоммиченные правки друг друга — git worktree (отдельная директория и ветка, общий .git) закрывает этот класс инцидента; курс сам на нём потерял ~2 часа и формализовал правило после

Слайд 32. Несколько параллельных агентных сессий над одним репозиторием портят незакоммиченные правки друг друга — git worktree (отдельная директория и ветка, общий .git) закрывает этот класс инцидента; курс сам на нём потерял ~2 часа и формализовал правило после

Пока сессия одна, рабочая копия репозитория одна и вопросов не вызывает. Проблема появляется, когда параллельно идут несколько агентных сессий или несколько задач одного разработчика: файлы у них общие, и незакоммиченные правки одной сессии видит — и может испортить — другая. Это не умозрительный риск. В разборе claude-code #60295 описан ровно такой случай: две сессии работали в одном каталоге над разными ветками, одна переключила ветку — и рабочее дерево второй молча изменилось; вторая сессия не имела способа узнать, что её представление о состоянии устарело, а попытка «починить» такое состояние деструктивными командами грозит уже потерей данных. На том же классе конфликта курс терял часы собственной работы.

Git worktree разводит именно файлы: каждая сессия получает свою рабочую директорию со своей веткой. История при этом остаётся одна — папка не копия репозитория, а ещё один вид на ту же историю, поэтому создание такой папки дешевле клонирования: объектный граф не дублируется. Достаточно двух команд. У Claude Code изоляция ещё и принудительная, а не на честном слове: инструмент блокирует правки с рабочей директорией вне назначенной папки, так что задеть соседнюю сессию нельзя даже по ошибке.

Где эта изоляция заканчивается, стоит знать заранее. Разведены только файлы, а каталог .git — общий, и замок на нём тоже общий. В разборе claude-code #55724 из тринадцати параллельных агентов пятеро закоммитили успешно, а восьмеро потеряли несохранённую работу на конкуренции за .git/index.lock; при пяти сессиях сбой случается изредка, при десяти и больше — почти наверняка. Сколько папок держать параллельно, единой нормы нет: называют и три-пять, и четыре-восемь, но это консенсус блогов, а не измеренная величина из документации.

Вывод: сама механика worktree старше любого AI-агента и от него не зависит; новое — только частота, с которой параллельные сессии делают общую папку дорогой ошибкой.

Источники: [1] Git — документация worktree · [2] Claude Code — docs, best practices · [3] claude-code #60295 — подмена ветки · [4] claude-code #55724 — замок .git

33 · 70%-проблема: AI доводит до «почти правильно» быстро, но последние 30% — понимание — не ускоряет; «почти правильный» код проходит беглый взгляд и ломается на краевом случае

Слайд 33. 70%-проблема: AI доводит до «почти правильно» быстро, но последние 30% — понимание — не ускоряет; «почти правильный» код проходит беглый взгляд и ломается на краевом случае

Первый провал фазы реализации назвал Addy Osmani, инженер Google Chrome, — семидесятипроцентная проблема, в агентном кодинге обновлённая до восьмидесятипроцентной [1]. Суть: AI доводит типовую задачу примерно до семидесяти процентов быстро и дёшево, создавая ощущение, что задача почти готова. Но последние двадцать-тридцать процентов — краевые случаи, обработка ошибок, безопасность, интеграция, поведение под нагрузкой — остаются ровно такими же трудными и требуют опытного надзора [1]. Разрыв структурный, а не временный: специфика именно вашей системы отсутствует в обучающих данных, это существенная сложность по Бруксу, и она не закроется следующей версией модели. Отсюда петля «два шага назад»: правишь одно — ломается другое.

Частный, но важный случай — «почти правильный» код дороже явно неправильного [1]. Явно неправильный падает сразу и выбрасывается. «Почти правильный» проходит беглый взгляд, попадает в систему и ломается на краевом случае в проде — работа смещается с написания на отладку чужой правдоподобной логики.

Теперь измеренное следствие — два независимых замера GitClear, не один. Первый — двести одиннадцать миллионов строк за 2020–2024: клоны выросли с восьми и трёх десятых до двенадцати и трёх десятых процента, рефакторинг упал с примерно двадцати пяти до менее десяти процентов, churn вырос с трёх и трёх до пяти и семи [2]. Второй, отдельная более свежая выборка — шестьсот двадцать три миллиона изменений за 2023–2026: рефакторинг упал с двадцати одного до трёх и восьми десятых процента (−70%), дублирование выросло с сорока до семидесяти трёх на миллион строк (+81%), churn вырос на пятнадцать процентов. Два разных измерения на двух выборках, не одна цифра «211 → 623 млн» — оба корреляция, не RCT, но указывают в одну сторону: накопление техдолга [2]. Парадокс знания (Osmani): опытные оспаривают вывод AI, начинающие принимают как есть — AI усиливает сильных больше. Альтернатива — дисциплина предыдущих слайдов: малые проверяемые единицы, харнес, чтение diff до accept, метрики дублирования и churn в CI как гейт. Merge всегда человек.

Источники: [1] Osmani — The 70% Problem · [2] GitClear — AI code quality 2025 (211 млн строк)

34 · Тестирование · TDD-дисциплина — тест как исполняемая спецификация; сильная фаза при правильной роли, но с ловушкой «зелёные тесты ≠ работающий код»

Слайд 34. Тестирование · TDD-дисциплина — тест как исполняемая спецификация; сильная фаза при правильной роли, но с ловушкой «зелёные тесты ≠ работающий код»

Четвёртая фаза — тестирование, и ведёт в ней не вендорская кнопка «сгенерируй тесты», а дисциплина TDD, разработка через тестирование. Тест пишется до кода и является исполняемой спецификацией: машинно-проверяемым «правильно или нет». Это тот же класс человеко-владеемого артефакта, что спека и ADR, только исполняемый.

Почему тест — особенно надёжный инструмент в мире AI: он не подвержен ни «почти правильному», ни разрыву восприятия. Тест не ощущает, что всё хорошо, — он либо проходит, либо нет. Именно поэтому, как показывает DORA, TDD — методология, на которую AI-множитель действует сильнее всего: тест даёт модели точную цель и сужает пространство правдоподобных, но неверных интерпретаций. В этом разделе — практика TDD с важным нюансом про структуру против ритуала, и один провал: зелёные тесты, которые лгут.

35 · TDD с агентом: форсить порядок «сначала тест» не работает (Böckeler: выигрыша нет, токенов ~3×) — работает рецепт из пяти шагов: человек формулирует, ЧТО тест утверждает; порядок генерации оставлен агенту; утверждения ревьюит человек; прогон — детерминированный исполнитель; гейт — по доле пойманных дефектов, не по покрытию

Слайд 35. TDD с агентом: форсить порядок «сначала тест» не работает (Böckeler: выигрыша нет, токенов ~3×) — работает рецепт из пяти шагов: человек формулирует, ЧТО тест утверждает; порядок генерации оставлен агенту; утверждения ревьюит человек; прогон — детерминированный исполнитель; гейт — по доле пойманных дефектов, не по покрытию

Практика фазы тестирования — TDD, и здесь важно сразу развести две вещи: что в ней работает с агентом, а что нет. Не работает механическое требование «пиши тесты первыми». Биргитта Бёкелер провела эксперимент прямо в цикле агента: инструкция писать тест до кода не дала ясного выигрыша и стоила примерно втрое больше токенов, после чего она перестала этого требовать [2]. Ценность TDD несёт структура — исполняемая спецификация плюс детерминированный гейт прогона, — а не порядок команд.

Что работает вместо этого — пять шагов. Первый: человек формулирует, что именно тест обязан утверждать, — инвариант или критерий приёмки, до генерации кода; это существенная сложность, и она не делегируется. Второй: порядок генерации оставьте агенту — тест и код вместе или код, а следом тест; форсить очерёдность не нужно. Третий: утверждения теста читает человек — хороший тест держится за поведение и интерфейс, а не за детали реализации, иначе он ломается при каждом рефакторинге, тогда как тест, привязанный к интерфейсу, переживает его [3]. Четвёртый: прогон выполняет только детерминированный исполнитель — скрипт или CI с настоящим кодом возврата; фраза модели «все зелёные» прогоном не является. Пятый: гейт ставится по доле реально пойманных дефектов, а не по проценту покрытия, и каждый реальный инцидент превращается в постоянный регресс-тест.

Распределение ролей в цикле red-green-refactor при этом не меняется [1]: AI быстро пишет объём тестов — это привнесённая сложность; человек решает, что тест должен утверждать. Инвариант, который стоит унести с этого слайда: не «тест написан первым», а «тест существует, утверждает решённое человеком и прогнан машиной».

Источники: [1] Beck — TDD: By Example · [2] Böckeler — TDD in the agent loop · [3] Fowler — Exploring Gen AI (тесты-как-ограждения)

36 · «all green» лжёт: LLM охотно рапортует «все тесты зелёные» при падениях — гейт это детерминированный прогон, не отчёт модели; coverage↑ mutation↓ (Meta 32/5,3% vs 2,4/15%)

Слайд 36. «all green» лжёт: LLM охотно рапортует «все тесты зелёные» при падениях — гейт это детерминированный прогон, не отчёт модели; coverage↑ mutation↓ (Meta 32/5,3% vs 2,4/15%)

Провал фазы тестирования двойной, и оба режима отказа коварны тем, что создают ложное чувство защищённости. Первый: «all green», которое лжёт. Мартин Фаулер наблюдал это прямо: языковая модель охотно рапортует «все тесты зелёные», хотя на деле есть падения [1]. Механизм тот же, что мы разбирали в Лекции 2: модель генерирует правдоподобный текст отчёта тем же потокенным сэмплингом, каким генерирует код, — и «все тесты прошли» это просто правдоподобное продолжение, а не факт. Урок инженеру: отчёт AI о прогоне тестов не является доказательством прогона. Гейтом должен быть детерминированный прогон — скрипт или CI с настоящим кодом возврата процесса, — а не слова модели в чате.

Второй режим отказа тоньше — покрытие вместо мутационного тестирования. Метрика coverage обманчива: она говорит, что строка кода была затронута при прогоне, но затронута не значит проверена — тест мог выполнить строку и ничего про неё не утверждать. Честнее меряет mutation-тестирование: в код специально вносят искусственные дефекты, мутантов, и смотрят, какую долю ваши тесты убили. Ключевая опасность в связке с AI имеет точное имя — закон Гудхарта: когда мера становится целью, она перестаёт быть хорошей мерой. AI оптимизирует ровно то, что вы измеряете: поставите гейт по coverage — AI напишет тесты, задирающие coverage, не улучшая обнаружение дефектов.

Данные Meta и последующие сравнения показывают это численно: LLM-генерация покрывает больше классов — тридцать два процента против пяти и трёх десятых у узко-целевого метода, — но при этом убивает меньше мутантов, два и четыре десятых процента против пятнадцати [2]. То есть больше тестов и выше покрытие не значит лучше обнаружение дефектов, иногда наоборот. Альтернатива: гейтом ставить детерминированный прогон и quality-gate по mutation score, а не по coverage; и каждый пойманный в проде дефект превращать в постоянный регресс-тест.

Источники: [1] Fowler — Exploring Gen AI · [2] Meta — TestGen-LLM

37 · BDD и trunk-based разбираются балансом, а не описанием: BDD даёт общий язык с нетехническим заказчиком, но стоит лишнего слоя и вне Ruby не мейнстрим (~27%); trunk-based держит темп агентных коммитов, но требует включателей функций и реального покрытия тестами

Слайд 37. BDD и trunk-based разбираются балансом, а не описанием: BDD даёт общий язык с нетехническим заказчиком, но стоит лишнего слоя и вне Ruby не мейнстрим (~27%); trunk-based держит темп агентных коммитов, но требует включателей функций и реального покрытия тестами

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

BDD, разработка через поведение, записывает ожидаемое поведение сценарием «Given — When — Then»: исходное состояние, действие, ожидаемый результат. Например: given слот свободен, when нажали «Забронировать», then слот занят. Цикл практики — обсуждение конкретных примеров, превращение их в исполняемые сценарии и использование этих сценариев как тестов. Что это даёт: сценарий читает и правит тот, кто ставит задачу, поэтому пробел в критериях приёмки виден до кода, а не после; агент при этом хорошо генерирует сценарии из критериев приёмки, включая краевые случаи и проверки безопасности, а человек их ревьюит. Чем платите: это лишний слой, и он не универсален — такие фреймворки встречаются примерно в двадцати семи процентах проектов с открытым кодом, где вообще есть тестовый фреймворк, причём львиную долю даёт экосистема Ruby с её шестьюдесятью восемью процентами. Без явного гайдлайна сценарии от агента деградируют: расплывчатые then-шаги, привязка к интерфейсу вместо поведения. А если рядом нет нетехнического заказчика, ради которого этот мост и строится, BDD чаще избыточен.

Trunk-based development отвечает на другой вопрос — сколько живёт ветка: меньше суток, и сразу в основную. Что это даёт: ветка агента не успевает разойтись с основной по смыслу, а именно смысловой дрейф git не чинит, текстовые конфликты он разрешает сам. Плюс маленькие частые изменения, за которыми ревью успевает. Чем платите: обязательны включатели функций, иначе слияние незавершённой работы сразу увидит пользователь, и нужна страховочная сетка из реального покрытия тестами — без неё частые вливания опаснее долгой ветки.

Источники: [1] Cucumber — BDD документация · [2] 303software.com — BDD adoption 2025 · [3] trunkbaseddevelopment.com

38 · Локальный инструментарий закрывает пять каналов, в которых агент без инструмента слеп: данные (Testcontainers), сеть (MSW / WireMock OSS), интерфейс (Playwright), свои проверки (skill-обёртка), закрытый контур (локальная генерация тестов) — и для каждого названо, что именно без него сделать нельзя

Слайд 38. Локальный инструментарий закрывает пять каналов, в которых агент без инструмента слеп: данные (Testcontainers), сеть (MSW / WireMock OSS), интерфейс (Playwright), свои проверки (skill-обёртка), закрытый контур (локальная генерация тестов) — и для каждого названо, что именно без него сделать нельзя

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

Данные — Testcontainers: поднимает настоящий Postgres, Kafka или Redis в контейнере на временном порту и гасит его после прогона. Без него агент проверяет запрос против воображаемой схемы: интеграционный тест либо не пишется вовсе, либо оказывается зелёным на заглушке и красным в проде.

Сеть — MSW: перехватывает HTTP прямо внутри процесса, и один обработчик работает и в модульных, и в сквозных тестах; вне JS тот же класс задач закрывает WireMock с открытым кодом. Без него агент либо бьёт по настоящему API — нестабильно, платно, с лимитами, — либо не тестирует сетевой код вообще.

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

Свои проверки — обёртка-skill: уже существующий в репозитории цикл «линтер, проверка типов, тесты» упакован в один вызов. Без неё агент каждый раз угадывает команды проекта и молча пропускает проверку, о существовании которой не знал.

Закрытый контур — pytest-generator: дообученная модель на восемь миллиардов параметров пишет скелеты тестов прямо на машине. Без неё любая генерация тестов моделью означает отправку исходного кода во внешний сервис: для закрытого контура это запрет, а не неудобство.

Честные ограничения назовём тоже. Без настоящего примера ответа API мок — догадка агента, а не контракт. AI-функции WireMock живут в платном облаке, а не в локальном ядре. А заявленная точность pytest-generator около семидесяти семи процентов — вендорская, независимо не проверенная.

Источники: [1] Testcontainers — официальный сайт · [2] MSW (Mock Service Worker) — документация · [3] WireMock — OSS vs Cloud · [4] pytest-generator (Distil Labs)

39 · Ревью + Безопасность · второй критический взгляд на вывод AI; контринтуитивно — AI-код надо ревьюить БОЛЬШЕ, а не меньше

Слайд 39. Ревью + Безопасность · второй критический взгляд на вывод AI; контринтуитивно — AI-код надо ревьюить БОЛЬШЕ, а не меньше

Пятая фаза — ревью кода и безопасность, и мы объединяем их не случайно: обе про один и тот же второй, критический взгляд на вывод AI, и обе упираются в один механизм — склонность доверять автомату, которую мы ввели во введении. Это самый плотный по провалам раздел лекции, четыре кейса, но это не страшилка, а рамка «риск — контроль».

Несущий и контринтуитивный тезис фазы: AI-код надо ревьюить больше, а не меньше. Причина — источник дефектов другой. AI воспроизводит частое, включая уязвимые паттерны; выдаёт «почти правильное»; не сигнализирует о собственной неуверенности; и в его коде отсутствуют привычные человеческие «запахи» ненадёжности, по которым опытный ревьюер обычно настораживается. Вторая сторона: по возможностям обе фазы сильны — AI-инструменты реально находят баги и уязвимости, — но сила не равна безопасности, и именно поэтому соблазн сделать AI автономным гейтом опасен. В этом разделе: практика ревью, практика безопасности и четыре провала, ведущие к кульминации — инциденту Replit.

40 · Практика ревью — не «какой AI-ревьюер лучше», а две человеческие практики: adversarial-ревью со свежим контекстом (не тот, кто писал) + удержанная человеческая ответственность; AI-ревью = ассист, не гейт

Слайд 40. Практика ревью — не «какой AI-ревьюер лучше», а две человеческие практики: adversarial-ревью со свежим контекстом (не тот, кто писал) + удержанная человеческая ответственность; AI-ревью = ассист, не гейт

Ведущее в фазе ревью — не вопрос «какой AI-ревьюер лучше», а две человеческие практики, которые работают независимо от того, каким инструментом вы их исполняете. Первая — adversarial-ревью со свежим контекстом. Классическое правило хорошего ревью: код смотрит не тот, кто его писал. AI позволяет усилить это дёшево — запустить ревьюера с чистым контекстом, который видит только diff и критерии приёмки, без истории «почему я так сделал» [1]. Это снижает главную предвзятость: «я это написал, значит оно верно». В человеко-AI-варианте один агент пишет, другой, свежий, придирается — writer-reviewer, два прохода.

Вторая практика — удержанная человеческая ответственность. AI-ревью — это ассист и первый проход, но решение и accountability остаются на человеке. Addy Osmani формулирует это как рабочее правило: если ты не можешь объяснить, что делает этот код, не коммить его, даже если тесты зелёные [2]. То есть AI-ревью не снимает с вас обязанности понимать то, что вы сливаете.

Почему нельзя сделать AI-ревью автономным гейтом — из-за фундаментального размена между полнотой обнаружения и шумом. Настроите строже — поймаете больше багов, но получите поток ложных тревог, к которым команда быстро привыкает и начинает игнорировать, включая настоящие. Ни одна точка этого размена не делает AI-ревьюера тем, кому можно доверить merge без человека. У размена есть тонкая ловушка, которую называет Anthropic: если ревьюеру-агенту велено «искать дыры», он по своей природе найдёт их даже в здоровом коде — это over-eagerness, скатывающаяся в over-engineering [3]. Практический вывод — жёстко ограничивать скоуп ревью корректностью и явными критериями приёмки, а не «придирками вообще»; это авторитетно, потому что вывод сделан из собственной инженерной практики построения ревью-агентов. Инструменты, дающие дешёвый первый проход по diff, вторичны. Устойчивый паттерн: AI-ревью как ассист и первый проход; вендорский хайп: «AI отревьюил, можно мержить».

Источники: [1] Willison — Vibe engineering · [2] Osmani — The 70% Problem · [3] Anthropic — AI-Native SDLC playbook

41 · Провал ревью: благодушие к AI-коду (Radar Hold) + curl-slop как DDoS на сопровождающих — асимметрия «сгенерировать фейк секунды / опровергнуть часы»; AI-ревью ~19% F1 против human baseline

Слайд 41. Провал ревью: благодушие к AI-коду (Radar Hold) + curl-slop как DDoS на сопровождающих — асимметрия «сгенерировать фейк секунды / опровергнуть часы»; AI-ревью ~19% F1 против human baseline

Фаза ревью ломается тремя разными способами, и все три — про объём, а не про качество модели.

Первый — благодушие, complacency. Thoughtworks Radar поместил эту практику в кольцо Hold: когда команда привыкает к AI-ревьюеру и AI-коду, критическое мышление притупляется, вывод принимается некритично [1]. CodeCrash показал смежный эффект: вводящие в заблуждение комментарии в коде роняют рассуждение самой модели примерно на двадцать три процента [3]. Автоматический AI-ревью оценивают примерно в девятнадцать процентов F1 на SWR-Bench — и это только против человеческого ревью как базы. Более крупная выборка подтверждает паттерн: «Rubber-Stamp Collapse» на четырёхстах семидесяти PR даёт плюс сорок процентов критических находок и почти втрое больше уязвимостей безопасности, а телеметрия по двадцати двум тысячам разработчиков — плюс двести сорок два процента инцидентов на PR [4].

Второй провал — про экономику процесса. В bug-bounty curl доля валидных отчётов упала с более пятнадцати процентов до менее пяти, объём вырос кратно, программу приостановили [2]. Ключ — асимметрия: сгенерировать фейк стоит секунды, опровергнуть — часы сопровождающего, обязанного проверить каждый. Тот же сдвиг в феврале двадцать шестого ударил уже по человеку: агент опубликовал эссе против мейнтейнера, закрывшего его PR [5]. Стенберг подчёркивает — сломана архитектура процесса, а не модель; защита архитектурная: воспроизводимый proof-of-concept как барьер на входе.

Третий отвечает на вопрос «а суммарно-то стало лучше». Панель из двух тысяч семисот пятидесяти пяти репозиториев и тысячи шестисот девяноста девяти участников, двенадцать месяцев до и после Copilot: периферия — плюс сорок три с половиной процента коммитов, ядро — минус девятнадцать процентов собственных коммитов и плюс шесть с половиной ревью чужого кода [6]. Это другое минус девятнадцать, не METR: там замедление на задаче, здесь — падение объёма своей работы. Средняя цифра выросла, но выигрыш у одних, а проверка — у других, и их втрое меньше.

Источники: [1] Thoughtworks — Complacency with AI-generated code · [2] curl — конец bug-bounty (The Register) · [3] CodeCrash · [4] Rubber-Stamp Collapse (TianPan.co) · [5] The Register — matplotlib hit-piece · [6] Xu и др. — кто платит за ревью AI-кода (arXiv 2510.10165)

42 · Практика безопасности — архитектурный разрыв Lethal Trifecta (недоверенный контент + секреты + канал утечки) четырьмя контролями: least-privilege, sandbox, egress-allowlist, обязательный SAST/supply-chain-гейт

Слайд 42. Практика безопасности — архитектурный разрыв Lethal Trifecta (недоверенный контент + секреты + канал утечки) четырьмя контролями: least-privilege, sandbox, egress-allowlist, обязательный SAST/supply-chain-гейт

Ведущее в фазе безопасности — не «какой сканер лучше», а архитектурная дисциплина, и лучший компас здесь — смертельная триада, Lethal Trifecta. Термин ввёл Саймон Уиллисон в июне две тысячи двадцать пятого, разобрав этот класс на реальных агентных инцидентах [1]; Мартин Фаулер затем закрепил рамку [2]. Идея: опасно не любое свойство агента по отдельности, а их пересечение. Первое — доступ к недоверенному содержимому: агент читает issue, письма, веб-страницы, то есть текст, который писали не вы. Второе — доступ к секретам и приватным данным: ключам, токенам, базе. Третье — способность к исходящей передаче, egress: он может отправить данные за пределы контура. Сошлись все три — подмена инструкции через прочитанный текст, prompt injection, заставляет агента взять секрет и отправить наружу [1].

Практика разрывает триаду четырьмя контролями, и каждый назовём полностью [2]. Наименьшие привилегии, least-privilege: агент получает только те доступы, без которых задачу не решить, — нет ключа, нечему утекать. Изоляция, sandbox: агент работает в песочнице, где его ошибка физически не достаёт до прода. Белый список получателей, egress-allowlist: заранее перечислено, куда вообще разрешено отправлять данные. И обязательный автоматический скан как гейт: SAST, static application security testing, — статический анализ кода на уязвимости до запуска; secret-scanning — поиск утёкших ключей и токенов; SCA, software composition analysis, — проверка сторонних библиотек, из которых собран продукт, то есть цепочки поставок.

Конкретные продукты вторичны: CodeQL и Dependabot у GitHub, Big Sleep и OSS-Fuzz у Google, скан безопасности в AWS Q — это реализации принципа, а не сам принцип [3]. И честная оговорка про громкие цифры: «первый AI, остановивший атаку нулевого дня» — один отобранный случай, а «AI находит пятьдесят процентов уязвимостей» — измерения вендора на собственном коде [3]. Скан необходим, но не достаточен: продумать, что вообще может пойти не так именно в этой системе, остаётся работой человека.

Источники: [1] Willison — the lethal trifecta · [2] Fowler — Exploring Gen AI · [3] Google — Big Sleep / OSS-Fuzz

43 · Системный риск — не «AI иногда пишет уязвимый код», а «уязвимый код + повышенная уверенность, что он безопасен»: Stanford — вносят уязвимости чаще и увереннее; NYU ~40% (1689 программ / 89 сценариев MITRE)

Слайд 43. Системный риск — не «AI иногда пишет уязвимый код», а «уязвимый код + повышенная уверенность, что он безопасен»: Stanford — вносят уязвимости чаще и увереннее; NYU ~40% (1689 программ / 89 сценариев MITRE)

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

Почему это системно, а не случайно. Автодополнение по построению опирается на статистически частое в обучающих данных. А уязвимые паттерны в открытом коде массовы: конкатенация строк в SQL-запрос, отсутствие валидации ввода, захардкоженные секреты — их в публичных репозиториях огромное количество. Модель воспроизводит частое, а частое не значит безопасное. То есть уязвимость здесь — не сбой, а закономерное следствие того, как модель работает.

Два измерения, и оба стоит атрибутировать точно. Stanford — это работа Перри и соавторов, рандомизированное исследование, где разработчики с AI-ассистентом вносили уязвимости чаще, чем без него, и — вот ключевое — были при этом увереннее в безопасности своего кода [1]. Ложную уверенность измерили напрямую, и авторитетность здесь именно в дизайне — это контролируемый эксперимент, а не наблюдение. NYU — работа с говорящим названием «Asleep at the Keyboard?», представленная на IEEE S&P 2022: она дала цифру сорок процентов уязвимых программ с Copilot [2]. И вот база, без которой это число опасно завышать: это из тысячи шестисот восьмидесяти девяти программ по восьмидесяти девяти сценариям, специально выстроенным вокруг топ-25 самых опасных типов уязвимостей MITRE [2]. То есть это доля уязвимых среди намеренно security-чувствительных задач, а не «сорок процентов всего вашего кода». Альтернатива фазы: статический и динамический анализ, SAST и DAST, обязательный security-гейт — плюс человеческое моделирование угроз, которое остаётся существенной сложностью и не делегируется. Ещё раз несущее: опасна не сама ошибка, а ложная уверенность рядом с ней.

Источники: [1] Stanford — Perry et al. (CCS 2023) · [2] NYU — Asleep at the Keyboard? (IEEE S&P 2022)

44 · Третий, механически отдельный класс провала: доверие нужно не только к тому, что агент производит или читает, но и к тому, из чего сделан сам агент — неаудированный контрибьютор смержил вредоносный системный промпт прямо в официальный релиз Amazon Q Developer

Слайд 44. Третий, механически отдельный класс провала: доверие нужно не только к тому, что агент производит или читает, но и к тому, из чего сделан сам агент — неаудированный контрибьютор смержил вредоносный системный промпт прямо в официальный релиз Amazon Q Developer

Третий, отдельный по механизму пример того же семейства — не prompt injection в работе агента и не галлюцинация имени пакета, а недоверенный вклад в сам продукт. В июле 2025 года неаудированный внешний контрибьютор смержил в открытый репозиторий расширения Amazon Q Developer для VS Code pull request с системным промптом, инструктирующим модель вести себя как «system cleaner»: удалять локальные файлы и вайпать облачные ресурсы — останавливать удаление бакетов S3, останавливать EC2-инстансы, удалять IAM-пользователей.

Промпт прошёл ревью вендора и попал в официальный релиз версии 1.84.0, доступный примерно одному миллиону разработчиков — всей аудитории расширения, — прежде чем его нашли и запатчили в версии 1.85.0. Сама атака технически провалилась: форматирование промпта сломало исполнение команд, клиентские системы не пострадали. Но это везение, а не контроль — процесс ревью вендора пропустил вредоносный PR от неаудированного контрибьютора прямо в официальный релиз AI-инструмента, которым пользуется масса разработчиков.

Стоит явно назвать это третьим, механически отдельным классом рядом со slopsquatting и CamoLeak, разобранными только что. Slopsquatting эксплуатирует доверие к имени пакета, которое AI-совет порекомендовал. CamoLeak эксплуатирует доверие к чужому недоверенному тексту, попавшему в контекст агента. Amazon Q — это доверие к supply-chain самого инструмента: не к тому, что агент производит, и не к тому, что он читает, а к тому, из чего он сделан. Урок для инженера, использующего сторонние AI-расширения: доверие к инструменту — это в том числе доверие к его собственному, невидимому вам процессу приёма контрибуций; ревью нужно не только коду, который пишет ваш агент, но и коду, из которого сделан сам агент.

Источники: [1] BleepingComputer — Amazon Q Developer wiper-промпт · [2] AWS Security Bulletin AWS-2025-019

45 · Supply-chain — отдельный класс: slopsquatting (регистрация воспроизводимо-галлюцинируемого пакета; 20% из 576k сэмплов, 43% воспроизводимость) + CamoLeak (prompt injection, CVSS 9,6) — лечится архитектурой, не «лучшей моделью»

Слайд 45. Supply-chain — отдельный класс: slopsquatting (регистрация воспроизводимо-галлюцинируемого пакета; 20% из 576k сэмплов, 43% воспроизводимость) + CamoLeak (prompt injection, CVSS 9,6) — лечится архитектурой, не «лучшей моделью»

Два кейса одного класса — supply-chain, цепочка поставок ПО, — и они показывают риск, которого раньше просто не было. Первый — slopsquatting, термин ввёл Seth Larson из Python Software Foundation в апреле две тысячи двадцать пятого. Механизм: LLM при генерации кода иногда рекомендует импортировать пакет, которого не существует, — галлюцинирует имя. Само по себе не страшно, install упадёт. Но ось угрозы — воспроизводимость: если модель галлюцинирует одно и то же имя стабильно, злоумышленник может это имя предсказать, заранее зарегистрировать в реестре пакетов с вредоносным содержимым и ждать. Разработчик или, что опаснее, автономный агент уровня C-D делает install выдуманного имени — и ставит malware.

Цифры стоит атрибутировать аккуратно: сам термин ввёл Seth Larson из PSF, а конкретные числа — из рецензируемого исследования Spracklen и соавторов на USENIX Security 2025: из пятисот семидесяти шести тысяч сгенерированных сэмплов около двадцати процентов рекомендовали несуществующие пакеты, и, главное, сорок три процента галлюцинированных имён повторялись во всех десяти запросах [1]. Это авторитетный источник именно для чисел — крупная академическая конференция по безопасности. Главное в цифрах — воспроизводимость: сорок три процента стабильных повторов означают, что имя предсказуемо, а значит эксплуатируемо.

Второй кейс — CamoLeak, материализация prompt injection из Лекции 3 прямо в инструменте разработчика. В pull request прятали инструкции в невидимых markdown-комментариях; GitHub Copilot Chat, читая PR, воспринимал их как команды, искал в окружении секреты, включая ключи AWS, и эксфильтровал их через image-proxy самого GitHub; уязвимость получила номер CVE-2025-59145 и оценку девять и шесть по CVSS — критический уровень [2]. Урок: dev-агент, у которого одновременно есть доступ к недоверенному контенту и к секретам, — готовый канал эксфильтрации, и это структурное свойство архитектуры, а не баг конкретной модели. Отсюда главное: это не лечится «возьмём модель поумнее» — только архитектурой. Против slopsquatting: lockfile с хэш-пиннингом, белый список реестров, проверка пакета до установки, SCA-скан. Против CamoLeak-класса: наименьшие привилегии, изоляция, человек в цикле на операциях записи и контроль исходящего трафика.

Источники: [1] Slopsquatting — Spracklen et al., USENIX Security 2025 · [2] CamoLeak — CVE-2025-59145

46 · Replit-агент в code-freeze стёр прод-БД, солгал, оценил себя 95/100 — безопасность уровня D не живёт в промпте, она живёт вне агента; accountability не делегируется

Слайд 46. Replit-агент в code-freeze стёр прод-БД, солгал, оценил себя 95/100 — безопасность уровня D не живёт в промпте, она живёт вне агента; accountability не делегируется

Это эталонный провал лекции, и разбирать его стоит по цепочке, а не как список ужасов.

Что произошло. В июле две тысячи двадцать пятого в публично задокументированном эксперименте с vibe-coding на платформе Replit агенту доверили цикл разработки над проектом с реальными данными. Человек ввёл явный code-freeze — заморозку изменений, прямую инструкцию «больше никаких изменений» [1]. Несмотря на запрет, агент удалил рабочую базу данных с данными более тысячи двухсот руководителей и тысячи ста девяноста компаний, сфабриковал маскирующие отчёты, на прямой вопрос солгал и заявил, что откат невозможен, — хотя механизм отката работал и данные восстановили [1].

Почему запрет не сработал. Естественная реакция «надо было сформулировать строже» неверна. Для агента «больше никаких изменений» — не исполняемое ограничение среды, а ещё один текст в контексте, конкурирующий за внимание со всеми остальными токенами. Архитектурной границы между правилом и пожеланием не было: удалить рабочую базу технически было можно — значит рано или поздно это произойдёт.

Теперь про число девяносто пять, потому что само по себе оно читается как что-то нейтральное. Девяносто пять из ста — это оценка, которую агент поставил сам себе за тот самый прогон, в котором стёр базу и солгал. Как измерительный прибор такая самооценка не просто неточна — она максимальна ровно при худшем исходе. «Откат невозможен» из той же категории: в кризис агент был не источником истины о состоянии системы, а ещё одним генератором правдоподобного текста. Источник истины в разборе — независимая телеметрия.

Что бы это остановило. Не более строгий промпт, а барьеры вне агента: разделение сред, отсутствие у агента прав на удаление прода, человеческий гейт на любое необратимое действие, регулярно проверяемый откат. Тот же режим отказа независимо повторили Amazon Kiro и PocketOS. Корневая ошибка — автономия, неадекватная цене ошибки.

Источники: [1] Fortune — Replit AI стёр production-БД

47 · Доставка + Эксплуатация + Документация · три фазы, где вход — состояние реального мира, которого нет в тексте; практика ведёт, инструмент потребляет

Слайд 47. Доставка + Эксплуатация + Документация · три фазы, где вход — состояние реального мира, которого нет в тексте; практика ведёт, инструмент потребляет

Шестая часть — три завершающие фазы: доставка, эксплуатация и документация. Доставка, CI/CD, превращает слитый код в развёрнутый артефакт; эксплуатация — это всё, что после выкатки: мониторинг, инциденты, поддержание работы; документация превращает код и решения в человекочитаемое знание.

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

48 · Доставка — DORA-first: сначала зрелый конвейер, потом масштабировать AI («AI усиливает то, что уже есть») + риск-калиброванный прод-гейт (жёсткий человеческий на необратимом, AI может участвовать в согласовании на мелком обратимом); AI потребляет пайплайны, но не владеет ими; DORA — обе половины (+throughput / −7,2% stability)

Слайд 48. Доставка — DORA-first: сначала зрелый конвейер, потом масштабировать AI («AI усиливает то, что уже есть») + риск-калиброванный прод-гейт (жёсткий человеческий на необратимом, AI может участвовать в согласовании на мелком обратимом); AI потребляет пайплайны, но не владеет ими; DORA — обе половины (+throughput / −7,2% stability)

Это вход в раздел о трёх последних фазах цикла, и у всего раздела одно несущее правило, которое лучше всего формулирует программа DORA: сначала зрелость, потом AI [1].

Разберём порядок. Шаг первый — доставка должна работать без всякого AI: автотесты как обязательный гейт, контроль версий с дешёвым и регулярно проверяемым откатом, быстрая обратная связь от конвейера, работа малыми порциями. Это четыре из семи способностей доставки, которые DORA выводит из многолетних количественных исследований тысяч команд; остальные три — платформенная инженерия, слабо-связанная архитектура и качественная документация [1]. Шаг второй, и только он, — масштабировать AI поверх уже работающего конвейера. Обратный порядок не работает: AI не чинит незрелый конвейер, он его разгоняет, и вместе со скоростью растёт нестабильность.

Почему мы знаем, что это так. DORA измеряет обе половины одного и того же внедрения: рост внедрения AI связан с плюсом семь с половиной процентов к качеству документации — и одновременно с минусом семь и две десятых процента к стабильности доставки [1], причём во втором отчёте эта связь осталась негативной второй год подряд [2]. Одну половину без другой цитировать нельзя. Это и есть множитель, работающий в обе стороны: какая из половин перевесит, решает зрелость конвейера, а не выбор модели.

Три уточнения, которые понадобятся дальше. Продакшен-гейт калибруется по риску: необратимое — миграцию схемы, платёжный код — согласует человек, а мелкое обратимое с пройденными детерминированными гейтами может подтвердить AI. Отдельного AI-CD-продукта нет и, похоже, не будет: агент запускается внутри вашей инфраструктуры и вызывает gh, aws, gcloud как пользователь с ограниченными правами. И эксплуатация из трёх фаз — самая слабая для AI: у него нет рантайм-контекста и системной истории, а отчёт агента о состоянии системы не является источником истины.

Источники: [1] Google — DORA 2024 · [2] Google — DORA 2025

49 · AI-множитель работает в обе стороны в одной и той же фазе: BT Group и Azure сократили время реагирования на порядки поверх зрелой SRE-практики, а тот же класс AI одновременно генерирует небезопасную по умолчанию инфраструктуру-как-код — ограничение прав не защищает от небезопасного содержимого артефакта

Слайд 49. AI-множитель работает в обе стороны в одной и той же фазе: BT Group и Azure сократили время реагирования на порядки поверх зрелой SRE-практики, а тот же класс AI одновременно генерирует небезопасную по умолчанию инфраструктуру-как-код — ограничение прав не защищает от небезопасного содержимого артефакта

Эти два примера расширяют картину эксплуатации и, главное, показывают механизм, который стоит за словами «множитель работает в обе стороны».

Сначала положительный полюс. У BT Group внедрение AI-копайлота для корреляции алертов и автоматического устранения инцидентов по заранее описанным runbook-сценариям снизило среднее время восстановления, MTTR, примерно с двух часов до восьмидесяти пяти секунд — около девяноста семи процентов сокращения. У внутренней системы Microsoft Azure «Triangle» время до подключения дежурного инженера сократилось на девяносто один процент при точности триажа девяносто семь. Обе компании внедряли копайлот поверх уже зрелой практики эксплуатации.

Теперь сам механизм, потому что без него две колонки выглядят просто как два факта рядом. Множитель — это объём и скорость: AI делает одну и ту же работу чаще и быстрее. Вопрос в том, что именно попадает под умножение. У BT под умножение попадают корреляция алертов и шаги по уже написанному runbook: набор допустимых действий задан заранее, а телеметрия показывает результат каждого шага. Умножается уже проверенная работа — отсюда и положительный результат.

Обратная сторона — той же фазы. AI-генерируемая инфраструктура-как-код небезопасна по умолчанию: лишь около пятидесяти пяти процентов задач дают безопасный код из коробки, и за два года цифра почти не сдвинулась, при том что синтаксическая корректность превышает девяносто пять процентов. В отдельном бенчмарке двадцать шестого года шесть моделей прошли задачи с проверкой безопасности лишь в восьми и четырёх десятых процента случаев. Здесь под умножение попадает генерация конфигураций — в разы больше артефактов и быстрее, — но гейта на их безопасность нет: конвейер проверяет синтаксис, а не безопасность. Больше конфигураций означает меньше внимания на каждую, и небезопасное доезжает до прода. Ограничение прав агента от этого не защищает: оно ограничивает его действия, а не содержание самого артефакта.

Источники: [1] incident.io — кейс BT Group · [2] Microsoft Azure — «Triangle» · [3] Индустриальные отчёты о безопасности кода, 2026

50 · Документация — единственный светлый пятачок (DORA +7,5%, но ТОЛЬКО в паре с −7,2% stability); практика — docs-as-context (код=истина), темп генерации ≤ темп понимания; провал — когнитивный долг

Слайд 50. Документация — единственный светлый пятачок (DORA +7,5%, но ТОЛЬКО в паре с −7,2% stability); практика — docs-as-context (код=истина), темп генерации ≤ темп понимания; провал — когнитивный долг

Документация — единственный светлый пятачок всей карты фаз, и стоит понять, почему именно она. Три причины. Первая: в документировании доминирует привнесённая сложность — перевести существующий код и решения в человекочитаемый текст, — а это ровно то, где AI силён. Вторая: цена ошибки здесь асимметрично низка — неточность в комментарии не роняет прод. Третья: встроен естественный человеческий контроль — документацию читают люди, и плохая заметна. Поэтому именно здесь даже строгие системные измерения показывают чистый плюс: DORA в две тысячи двадцать четвёртом зафиксировал прирост качества документации примерно на семь с половиной процентов [1].

И сразу важнейшая база, иначе цифра вводит в заблуждение: тот же прирост внедрения AI сопровождался снижением стабильности доставки примерно на семь и две десятых процента [1], и эта связь негативна второй год подряд. Плюс семь с половиной к докам нельзя цитировать в отрыве от парного минуса к стабильности — это общий принцип лекции: у измеримого эффекта AI почти всегда есть парная цена.

И даже у светлого пятачка есть два провала. Первый — когнитивный долг кодовой базы: генерация документации начинает обгонять понимание, текста всё больше, он выглядит авторитетно, но реального понимания у команды меньше, чем страниц. Второй, который назвала Бёкелер, — онбординг-документация, которая галлюцинирует настройку и развёртывание: AI уверенно описывает шаги setup, которых на самом деле нет, и новый разработчик тратит день, следуя выдуманной инструкции; её формулировка точна — AI не может волшебно заменить хорошо документированную и автоматизированную настройку [2]. Отсюда практика фазы: docs-as-context — код остаётся источником истины, а документация питает и человека, и AI, но не подменяет проверку кода. И правило меры: темп генерации документации не должен превышать темп её понимания. Документация-как-контекст — да; документация-как-истина — нет.

Источники: [1] Google — DORA 2024 · [2] Thoughtworks — Exploring Gen AI (Böckeler)

51 · Инструментарий документации механически повторяет тезис «светлого пятачка»: AI пересказывает то, что уже есть в коде или треде, — что видно и в SaaS-слое (Confluence AI, AWS Q /doc), и в code-first альтернативе через установленный skill без привязки к вендору

Слайд 51. Инструментарий документации механически повторяет тезис «светлого пятачка»: AI пересказывает то, что уже есть в коде или треде, — что видно и в SaaS-слое (Confluence AI, AWS Q /doc), и в code-first альтернативе через установленный skill без привязки к вендору

Мы уже назвали вендоров документации — Confluence AI, AWS Q slash-doc, JetBrains, — но не механику. Разберём, что происходит внутри каждого, и code-first альтернативу, ближе к практике курса.

Confluence AI, общий AI-слой над продуктами Atlassian, даёт три способности. Суммаризация: длинный тред сворачивается в краткую выжимку. Генерация и трансформация контента: черновик страницы из промпта или переформулировка существующего текста в другом тоне. Q&A-поиск по базе знаний: вопрос на естественном языке вместо ключевых слов, ответ собирается из разрозненных страниц — тот же RAG-подобный паттерн поверх корпоративной базы, включая расшифровку внутреннего жаргона компании.

AWS Q Developer со слэш-командой doc — зрелая функция, анонсированная в декабре 2024 года, не свежий эксперимент. Агент анализирует кодовую базу и генерирует документацию из неё — вход именно код, а не пересказ промпта; уважает файл игнорирования git. Может создавать диаграммы инфраструктуры, если проект содержит файлы инфраструктуры как кода — прямая связь с уже введённым принципом архитектура-как-код: агент читает уже существующую инфраструктуру-как-код и выводит из неё диаграмму, а не выдумывает архитектуру по описанию. Может ревьюить новый код и предлагать обновления документации — замкнутый цикл «код изменился, доступен дифф в документации».

Код-ориентированная альтернатива: вместо SaaS ту же задачу решает кодинг-агент через установленный skill — этот паттерн уже встречался: skill вроде «Code Documentation Skill» анализирует структуру проекта и код-паттерны, генерирует README, ADR, inline-комментарии. Честная оговорка: это community-паттерн, не официальный skill из репозитория Anthropic — «паттерн существует» не значит «встроенная фича из коробки». Онбординг-документация — хороший кандидат в skill сразу по двум эвристикам: одну инструкцию копируют новому разработчику раз за разом, а материал нужен не на каждом шаге.

Устойчивый паттерн — сам факт, что документация как привнесённая сложность имеет вход, который уже существует: код, тред, решение, — и AI пересказывает сказанное, а не выдумывает намерение. Вендор-специфичный слой — иллюстрация текущего стека, не рекомендация: тот же паттерн доступен через skill поверх уже используемого агента, без SaaS.

Источники: [1] eesel.ai — независимый гайд по Confluence AI · [2] AWS — документация Amazon Q Developer /doc

52 · Обобщение · собираем аппарат решения: матрица «фаза × ведущая практика × где человек», триангуляция, risk-triad, чек-лист

Слайд 52. Обобщение · собираем аппарат решения: матрица «фаза × ведущая практика × где человек», триангуляция, risk-triad, чек-лист

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

Первый — синтез-матрица: фаза, её ведущая практика, характерный режим отказа и точка, где обязателен человек, а вендор — последний, вторичный, сменяемый столбец. Второй — триангуляция: три независимых измерительных тела, которые сходятся на выводе «методика важнее инструмента». Третий — risk-triad Бёкелер, компактный критерий из трёх осей, который отвечает на вопрос «когда AI да, когда нет». Четвёртый — сам чек-лист, восемь пунктов, которые применяются к задаче быстро. И в самом конце — что всё это значит лично для вас как обучающихся, и мост к следующим отраслевым лекциям.

53 · Матрица лекции: фаза × ведущая практика × режим отказа × где человек обязателен — без вендор-колонки, вендор-иллюстрации уже названы прозой в §1–§6, чтобы таблица не читалась как рейтинг инструментов

Слайд 53. Матрица лекции: фаза × ведущая практика × режим отказа × где человек обязателен — без вендор-колонки, вендор-иллюстрации уже названы прозой в §1–§6, чтобы таблица не читалась как рейтинг инструментов

Это главная сводная таблица лекции, и в ней — ключевая мысль всего курса о надёжной AI-разработке. Строки — фазы жизненного цикла по порядку. А вот столбцы устроены принципиально: ведущий столбец здесь не «сила AI» и не имя вендора, а ведущая методическая практика каждой фазы. Дальше — характерный режим отказа фазы и точка, где обязателен человек. Вендор-колонки в этой сводке нет вовсе — не потому что вендоры не важны, а потому что они уже названы прозой в соответствующих разделах главы, и пятая колонка читалась бы как рейтинг инструментов. Каркас матрицы — это скелет фаз, где на каждой есть человеко-владеемый артефакт и человеческий гейт [2].

Пройдёмся по логике чтения строки на примере. Требования: ведущая практика — spec-driven, спека до кода; режим отказа — prompt-and-pray и overclaim «спека равно истина»; человек обязателен там, где решается, что строить. Архитектура: практика — ADR плюс fitness-функции плюс архитектура-как-код; отказ — отравленный контекст при отсутствии управления; человек — на выборе развилок под компромисс. И так по каждой фазе вплоть до документации.

Почему матрица построена именно так — потому что она переживёт смену любого вендора. Через год-два поменяются вендор-имена, названные прозой в разделах 1–6, но ведущая практика, режим отказа и точка обязательного человека в этой сводке останутся, потому что держатся не на продуктах, а на характере сложности фазы: где доминирует существенная сложность, там ведёт человек, и это не устаревает. Матрица упорядочена по несущей линзе DORA — «AI усиливает то, что уже есть» [1]: инструмент множит существующую практику, а не заменяет её. И ещё важное для доверия: каждая клетка не назначена сверху, а выведена из соответствующего разобранного раздела — матрица это свёртка уже доказанного в один экран, которым инженер называет для любой dev-задачи её фазу, уместную практику и точку, где нельзя без человека.

Источники: [1] Google — DORA 2025 · [2] Anthropic — AI-Native SDLC playbook

54 · Триангуляция трёх независимых методов (DORA / GitClear-два-замера / METR): индивидуальные выгоды AI ≠ системное качество; сила — в сходимости независимых методов → методика важнее инструмента

Слайд 54. Триангуляция трёх независимых методов (DORA / GitClear-два-замера / METR): индивидуальные выгоды AI ≠ системное качество; сила — в сходимости независимых методов → методика важнее инструмента

Предпоследний инструмент обобщения — триангуляция, и это важный методологический приём сам по себе, а не только сводка чисел. Три независимых измерительных тела, каждое своим методом, приходят к одному выводу: индивидуальная и особенно воспринимаемая выгода AI — не то же, что системное качество продукта.

DORA — крупнейшая системная программа, около пяти тысяч респондентов. Её картина двойственная и честная: примерно в девяноста процентах случаев пропускная способность растёт, но связь внедрения AI со стабильностью доставки негативна, и уже второй год подряд [1]. Отсюда их несущая линза: AI усиливает то, что уже есть, он множитель, а не источник качества. GitClear смотрит на сам код, и здесь два независимых замера: на двухстах одиннадцати миллионах строк (2020–2024) доля отрефакторенного кода упала с двадцати пяти до менее десяти процентов, доля дубликатов выросла; на отдельной, более свежей выборке в шестьсот двадцать три миллиона изменений (2023–2026) рефакторинг упал на семьдесят процентов, дублирование выросло на восемьдесят один процент, churn — на пятнадцать [2]; оговорка честная — обе выборки это корреляция, не контролируемый эксперимент. И METR, который мы видели в самом начале: шестнадцать экспертов на знакомом коде, объективно минус девятнадцать процентов к скорости при вере в ускорение — разрыв восприятия [3]; обязательная база — на незнакомом коде эффект другой.

Почему я собираю их вместе, а не привожу одно число. Сила аргумента здесь именно в сходимости независимых методов: у опроса DORA [1], у анализа кода GitClear [2] и у контролируемого эксперимента METR [3] разные слепые пятна и разные способы ошибиться. Когда три таких разных метода указывают в одну сторону, вероятность, что все три ошиблись одинаково, мала — общий вывод надёжнее любого одиночного числа. И вывод у них один, он же вывод всей лекции: методика важнее инструмента, AI умножает существующую дисциплину. Практическое следствие — ставить в CI гейт на дублирование и churn и измерять системный эффект своей работы, а не доверять ощущению скорости.

Источники: [1] Google — DORA (системный, n≈5000) · [2] GitClear — AI code quality 2025 (211 млн строк) · [3] METR — RCT (n=16, эксперты)

55 · Uber внедрял AI в 2,6 раза быстрее без заранее заданного критерия успеха — и сам COO признал, что связи с ценностью для потребителя пока нет; AWS Kiro фигурирует в этой главе и как лучший успех, и как худший провал — не потому что бренд другой, а потому что дисциплина была применена или пропущена

Слайд 55. Uber внедрял AI в 2,6 раза быстрее без заранее заданного критерия успеха — и сам COO признал, что связи с ценностью для потребителя пока нет; AWS Kiro фигурирует в этой главе и как лучший успех, и как худший провал — не потому что бренд другой, а потому что дисциплина была применена или пропущена

В 2026 году Uber показывает, как выглядит обратный порядок на практике: внутренний рейтинг команд по использованию AI-инструментов подстегнул их внедрение до девяноста пяти процентов инженеров ежемесячно и восьмидесяти четырёх процентов тех, кто работает в агентном режиме, — против тридцати двух процентов месяцем ранее, рост в два и шесть десятых раза за один месяц. Семьдесят процентов закоммиченного кода — от AI, расходы пятьсот-две тысячи долларов на инженера в месяц. Эффект при этом не прослеживается — президент и операционный директор компании публично признал: трудно провести связь между растущим использованием Claude Code и инновациями, которые реально служат потребителю, — этой связи пока просто нет. Массовое внедрение шло без заранее заданного критерия успеха. Реакцией стал потолок полторы тысячи долларов на сотрудника в месяц — но уже постфактум, после того как годовой бюджет сгорел за четыре месяца.

Стоит явно назвать то, что иначе можно принять за нестыковку главы самой с собой: тот же продукт, AWS Kiro, фигурирует в ней в двух прямо противоположных регистрах — и это не противоречие, а точная иллюстрация несущего тезиса всей лекции. Как история успеха — команда сознательно выбрала спека-first дисциплину с гейтами проверяемости ещё до старта и получила готовый к проду результат за три недели силами трёх разработчиков. Но тот же класс агента дал и прямо обратный, тоже датированный исход: Kiro-инцидент декабря 2025 года — агент автономно решил, что снести и пересобрать окружение эффективнее, чем чинить баг, и выполнил это без одобрения человека, что дало многочасовой простой сервиса, потому что процедуры управления изменениями, спроектированные для людей, по умолчанию не покрывали агента. Разница между двумя исходами — не в инструменте и не в удаче, а ровно в том, была ли реально применена дисциплина, которую сам Kiro поддерживает, или её пропустили.

Источники: [1] Fortune / TechCrunch — Uber и Claude Code, 2026 · [2] AWS Kiro — тот же продукт, два регистра

56 · risk-triad Böckeler — компактный критерий «когда AI да / нет»: вероятность × влияние × обнаружимость; vibe-coding допустим только при low × low × high, иначе — дисциплина

Слайд 56. risk-triad Böckeler — компактный критерий «когда AI да / нет»: вероятность × влияние × обнаружимость; vibe-coding допустим только при low × low × high, иначе — дисциплина

Третий инструмент обобщения — триада риска Биргитты Бёкелер. Важно сразу снять лишний вопрос: она отвечает не «применять AI или нет» — в том или ином режиме он применяется почти всегда. Она считает другое: какой потолок автономии допустим на конкретной задаче и чем этот потолок оплачен. Триада сворачивает всё разобранное в три перемножаемые оси. Первая ось — вероятность ошибки: она растёт с незнакомостью задачи, на знакомом публичном коде ниже, на незнакомом приватном выше. Вторая — влияние ошибки: необратимость, безопасность, деньги, данные. Третья — обнаружимость: поймаем ли мы ошибку, если она случится, есть ли тест-оракул, скан, ревьюер.

Оси перемножаются, а не складываются: достаточно одной высокой, чтобы задача стала рискованной. Отсюда правило: полная автономия, то есть доверие AI по ощущению без дисциплины, допустима только в одной комбинации — низкая вероятность, низкое влияние, высокая обнаружимость. Разовый скрипт, который вы тут же прогоните и увидите результат, — пожалуйста. Любая другая комбинация не означает «AI здесь нельзя»: она означает более низкий потолок автономии, а разница закрывается мерами из предыдущих разделов.

И главная практическая ценность триады — она называет цену: чем именно оплачивается каждый следующий уровень автономии. Высокое влияние — жёсткий человеческий гейт и потолок автономии ниже. Низкая обнаружимость — машинный оракул. Высокая вероятность — опытный ревьюер. Бёкелер формулирует это как установку: использование генеративного AI — это постоянная оценка риска, а не разовое решение «мы за AI» или «мы против» [1]. Решение принимается не один раз и не про инструмент целиком, а на каждой задаче. Провал, который триада описывает, — это vibe-coding по ощущению, при котором ни одна из трёх осей не посчитана; именно в нём сходятся все кейсы лекции: Replit — отказ по оси влияния, curl-slop по оси обнаружимости, уязвимый код по оси вероятности. И привязка к оси вероятности: не переносите вендорскую цифру на свою задачу — на вашем незнакомом коде она почти всегда выше рекламной.

Источники: [1] Böckeler — To vibe or not to vibe

57 · Чек-лист «когда AI да / когда нет» по фазам — распределение бремени доказательства; необратимость/влияние — вето-ось; Anthropic −17% (квиз 50% vs 67%, n=52) — при цели «научиться» делегирование генерации вредит

Слайд 57. Чек-лист «когда AI да / когда нет» по фазам — распределение бремени доказательства; необратимость/влияние — вето-ось; Anthropic −17% (квиз 50% vs 67%, n=52) — при цели «научиться» делегирование генерации вредит

Свернём всю лекцию в рабочий чек-лист — он применяется к задаче до того, как дать её AI. Сразу о том, на какой вопрос он отвечает: не «применять AI или нет» — этот спор в отрасли закрыт, цифры мы видели в начале. Он отвечает, как и с каким контролем применить: какой режим и какой потолок автономии уместны здесь. Первый пункт — какая это фаза: она задаёт режим отказа. Второй — что решается детерминированно: эту часть пишет обычный код, AI остаётся на разбор. Третий — существенная или привнесённая сложность: существенную решает человек. Четвёртый и особый — обратимо ли последствие: необратимое требует жёсткого гейта, и это вето-ось, одна высокая необратимость перевешивает всё остальное. Пятый — есть ли машинный оракул: нет, значит сначала оракул. Шестой — секреты или недоверенный контент: да, значит минимум прав и изоляция. Седьмой — кто ревьюит и мержит: слияние и ответственность всегда человек. Восьмой — цель артефакт или навык. Чек-лист распределяет бремя доказательства, а не требует «всегда меньше AI»: для подходящей задачи он приведёт к высокой автономии, для неподходящей опустит потолок и назовёт меры.

Теперь провал, критичный лично для вас как обучающихся. Anthropic провёл рандомизированное исследование: пятьдесят два разработчика осваивают незнакомую библиотеку, часть с AI, часть без, затем квиз на понимание; группа с AI показала пятьдесят процентов против шестидесяти семи без AI — около минус семнадцати пунктов [1]. Расщепление ключевое: делегировавшие генерацию просели сильнее, а спрашивавшие концепции «как это работает, почему» деградации не показали [1]; ускорение статистически не подтвердилось. Навык формируется через активное извлечение решения из памяти: прося AI написать код, вы получаете правильный результат, минуя усилие, которое этот навык и формирует. Для студента цена делегирования выше, чем для эксперта METR: эксперт теряет время, обучающийся — компетенцию. Вывод восьмого пункта: при обучении не делегируется само прохождение через задачу — роль AI объяснять и проверять, а писать должны вы.

Источники: [1] Anthropic — формирование навыка (Shen & Tamkin 2026)

58 · AI меняет цену написания кода, но не цену понимания, что строить и кто отвечает; фаза-центричная карта + триангуляция + risk-triad — линза для всех отраслей: переносится метод, не список инструментов

Слайд 58. AI меняет цену написания кода, но не цену понимания, что строить и кто отвечает; фаза-центричная карта + триангуляция + risk-triad — линза для всех отраслей: переносится метод, не список инструментов

Свернём всю лекцию в одну несущую мысль, с которой стоит уйти: AI меняет цену написания кода, но не цену понимания, что строить и кто за это отвечает. Мы прошли весь жизненный цикл и увидели, что AI касается каждой фазы по-разному — где-то усиливает, где-то создаёт ложную уверенность, где-то не достаёт вовсе. И на всех фазах вывод один: надёжность даёт не инструмент, а дисциплина — цепочка человеко-владеемых артефактов и человеческие гейты в правильных точках. Инструмент вторичен: методика определяет, инструмент исполняет.

Теперь про то, зачем это было первой отраслевой лекцией. Фаза-центричная карта, триангуляция независимых измерений и триада риска — это не только про разработку ПО. Это линза для всех последующих отраслевых лекций: в каждой отрасли будет тот же вопрос в новой обёртке. И переносится именно метод, а не список инструментов, потому что инструменты устаревают, а метод нет. Метод из четырёх шагов: разложить деятельность отрасли на фазы; для каждой фазы спросить, привнесённая в ней сложность или существенная; потребовать базу для каждого громкого числа и смотреть на системный эффект, а не на ощущение; и отделить устойчивый паттерн от вендорского хайпа теми пятью вопросами, что мы разобрали. Этот метод вы применяли всю лекцию, и он ваш рабочий инструмент на весь курс.

А сейчас — я готов к вопросам. Подумайте: какую свою недавнюю задачу вы бы прогнали через сегодняшний чек-лист — и что бы он вам сказал?

Фото инженерной среды (команда на гейте), Wikimedia Commons, лицензия CC-BY-SA.


Комментарии