Агент-инженер по репозиторию · Модуль 5 · Урок 5.1
Верификационный гейт: MR только на зелёном
Зачем (какую проблему чиним)
Агент версии v3 умеет писать и чинить, но «считает себя готовым» по собственному суждению. Доверять самооценке модели нельзя: она может объявить задачу решённой при красных тестах. Перед публикацией нужен объективный гейт — машинная проверка, а не мнение модели.
Решение и альтернативы
Решение: функция verify прогоняет весь allowlist проверок (build, tests, lint) в worktree и возвращает структурный вердикт. MR открывается, только если вердикт зелёный по всем пунктам. Красный вердикт = нет MR; агент либо чинит (петля v3), либо честно сообщает о провале. Гейт — детерминированный код, не суждение модели.
Альтернативы: спросить модель «готово ли?» — субъективно и обманчиво; гейт только на тестах без билда/линта — пропускает несобираемый или грязный код. Полный гейт по allowlist — объективная граница между «агент поработал» и «можно показывать человеку».
DIFF
Добавляем verify (структурный вердикт по allowlist) как обязательное предусловие любой публикации.
⚠ Безопасность
Верификационный гейт — машинный контроль качества перед выходом наружу. Он закодирован и не обходится моделью: даже если агент «уверен», красный verify физически блокирует создание MR (урок 5.2). Это прямое следствие honesty-инварианта версии v3 и предтеча task-completion eval (урок 5.4).
Проверка
На задаче с намеренно непроходящим тестом verify возвращает красный вердикт с указанием упавшего пункта; попытка открыть MR на таком вердикте отклоняется. На зелёном — гейт пропускает.
Глубже
Guardrails, верификация, human-in-the-loop — курс «Продакшн-разработка», Модуль 5 (гл. 10); eval-датасеты и регрессии — там же (гл. 9).
+package main
+
+import "context"
+
+// Verdict — машинный вердикт верификации. Green=true только если ВСЕ проверки прошли.
+type Verdict struct {
+ Green bool
+ Results map[string]string // check -> краткий итог/вывод
+}
+
+// verify прогоняет весь allowlist проверок в worktree. Детерминированный гейт,
+// не суждение модели: его результат решает, можно ли открывать MR.
+func verify(ctx context.Context, ws *Workspace) Verdict {
+ v := Verdict{Green: true, Results: map[string]string{}}
+ for _, key := range []string{"build", "tests", "lint"} {
+ out, _ := runCheck(ctx, ws.Dir, key)
+ ok := checkPassed(key, out)
+ v.Results[key] = summary(out)
+ if !ok {
+ v.Green = false
+ }
+ }
+ return v
+}Anti-patterns
| Грабля | Почему плохо | Как правильно |
|---|---|---|
| Спрашивать у модели «задача готова?» как критерий публикации | Самооценка модели субъективна и склонна к ложному успеху | Детерминированный гейт verify по allowlist (build/tests/lint) |
| Гейт только на тестах, без билда и линта | Несобираемый/грязный код проходит наружу | Зелёный вердикт по всем пунктам — обязательное предусловие MR |
Практическое задание (RA-v4)
- Реализовать
verify(build/tests/lint в worktree) со структурным вердиктом. - Сделать зелёный вердикт обязательным предусловием публикации.
- Закоммитить:
git commit -m "v4: verification gate".
Проверка знаний
Почему критерием «можно открывать MR» служит детерминированный verify, а не ответ модели «я закончил»?
Верный ответ: B
B. Доверять самооценке модели — значит впускать ложный успех. Детерминированный гейт по allowlist даёт объективный сигнал и физически блокирует публикацию красного кода независимо от «уверенности» агента.