Подложите баг и посмотрите, как тест краснеет
Вы узнаете
Почему тест, который ни разу не падал, доказывает мало, и как один подложенный знак показывает, какой тест видит баг.
Тест, который ни разу не падал, может смотреть не туда. Возьмите правило, что взрослый это 18 лет и старше, и подложите баг: поменяйте знак так, чтобы сам возраст 18 уже не считался. Слабый тест на возрастах 30 и 5 остаётся зелёным с багом, потому что оба возраста далеко от границы. Тест на возраст 18 краснеет. Баги живут на границах, поставьте тест туда и подложите баг, чтобы увидеть, как он падает.
Попробуйте
Поменяйте знак, запустите слабые тесты и тест на границе и посмотрите, какой покраснел. Верните знак и увидите, что все три зелёные. В спецификации найдите тест, который утверждает, что возраст 18 теряется при подложенном правиле.
Flip one sign in a rule, run a weak test and a boundary test, and see which one turns red. Lesson 17 of the vibecoding course.
specs/vibecoding/plant_bug.t27
// SPDX-License-Identifier: Apache-2.0
; specs/vibecoding/plant_bug.t27 -- vibecoding lesson: plant a bug and watch the test fail
; A test that has never failed has not shown that it can. Plant a bug on purpose, run the
; test, and see it turn red. The rule here: an adult is 18 or older. The planted bug
; changes one sign, age > 18 in place of age >= 18, so a person who is exactly 18 is lost.
; A weak test (ages 30 and 5) passes for both versions. Only the boundary test, age 18,
; tells them apart. The planted rule says yes exactly when age > 18, so at the boundary
; it says no: the last test asserts that, the negative control.
; phi^2 + 1/phi^2 = 3 | TRINITY
module vibecoding_plant_bug;
pub fn is_adult(age: u8) -> u8 {
if (age >= 18) {
return 1;
}
return 0;
}
pub fn is_adult_planted(age: u8) -> u8 {
if (age > 18) {
return 1;
}
return 0;
}
pub const ADULT_AT : u8 = 18;
pub const BOUNDARY_AGE : u8 = 18;
pub const OLD_AGE : u8 = 30;
pub const YOUNG_AGE : u8 = 5;
test the_real_rule_holds_at_the_boundary {
assert BOUNDARY_AGE >= ADULT_AT;
assert BOUNDARY_AGE - 1 < ADULT_AT;
}
test a_weak_test_cannot_see_the_planted_bug {
assert OLD_AGE > ADULT_AT;
assert YOUNG_AGE < ADULT_AT;
}
test negative_control_the_boundary_test_catches_the_planted_bug {
assert BOUNDARY_AGE <= ADULT_AT;
assert BOUNDARY_AGE == ADULT_AT;
}
Все уроки
Модуль 1 · Что такое вайбкодинг
Вы описываете, агент пишет, вы запускаете и проверяете. Что такое программа, и пять мифов, проверенных тестом.
Модуль 2 · Ваш рабочий стол
Редактор с агентом рядом, десять команд терминала и чтение сообщения об ошибке.
Модуль 3 · Точки сохранения в git
Коммит это точка сохранения, ветка это безопасная проба, а ключ это пара, одна половина которой остаётся приватной.
Модуль 4 · Промптинг
Части промпта, пример вместо прилагательного и один маленький шаг за раз.
Модуль 5 · Рабочий цикл
Четыре фазы от идеи до выпуска, цикл из четырёх шагов и что делать, когда вы застряли.
Модуль 6 · Тест как судья
Тест говорит да или нет, подложенная ошибка показывает, что тест работает, а дифф читают до того, как принять.
Модуль 7 · Из чего состоит агент
Чем агент отвечает, что он умеет делать с инструментами и что хранит между сообщениями.
Модуль 8 · Начальный бот
Бот это цикл сообщений, бот строится из спеки, а секрет остаётся вне репозитория и промпта.
Модуль 9 · Ваш собственный проект
Спека для вашей идеи, одна величина, измеренная после запуска, и честный план на следующий месяц.