diff --git a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md index e5128e0..ab5011b 100644 --- a/agents/.agents/skills/claude-subagent-playbook/references/lessons.md +++ b/agents/.agents/skills/claude-subagent-playbook/references/lessons.md @@ -608,3 +608,38 @@ compose down`); отдельных событий эскалации в `--json` medium — 46 команд. Одна находка фактическая (комментарий рекламировал торговые события, от которых спека отказалась) — её обе Клод-линии пропустили: подтверждение ценности другой родословной. + +## 2026-08-02: перепроверка толкает лечение в обе стороны (clickstream v2, тикет #38) + +Конфигурация та же, что 08-01: оркестратор он же исполнитель, Кодекс (high) +третьей линией к двум прошедшим Клод-линиям. Снова три находки, все верны; +снова другая родословная дала класс, мимо которого прошли обе Клод-линии — +честность тестов: сторож сравнивал день −N с днём N, а сталкиваются −N и N−1. + +- **Перепроверка тем же ревьюером не судит соразмерность лечения ни в одну + сторону.** 08-01 она вернула `ALL_CLOSED`, подтвердив исполнение + собственного предписания; здесь на ту же починку — `NOT_CLOSED` с + требованием недостижимого (полная неприкосновенность запомненной когорты: + в numpy владелец памяти размораживается всегда, а вид всегда показывает + `.base`). Одна дыра, две стороны. Приём: на `NOT_CLOSED` проверять не + только факт, но и существует ли закрывающее состояние, и мерить цену + альтернативы — здесь 16 МиБ копий на день вместо 2 мс, то есть размен + реального свойства на защиту от умысла. +- **Долг 08-01 не закрыт: статус вешается на находку, не на лечение.** Здесь + лечение судилось только потому, что владелец потребовал этого в + постановке («Кодекс коварен, польза бывает очевидна на первый взгляд»). + Механизма по-прежнему нет. +- **Новый класс: сломан не код, а измерительный прибор.** Цикл мутаций + «правка → прогон → откат» внутри секунды оставлял устаревший `.pyc` + (свежесть — по времени правки и размеру), тесты шли по байт-коду мутанта + и падали на восстановленном дереве. Чуть не «починил» работающее. Линии + ревью смотрят на код и такого не ловят; конвейер молча допускает, что + проверялка оркестратора исправна. Приём: мутации гонять с + `PYTHONDONTWRITEBYTECODE=1`, первым и последним прогоном — чистое дерево. +- **Польза линии пришла как «изменил, что я проверяю»**: находка развернула + батарею мутантов на дерево зёрен, которое я считал очевидным, — там + нашлись ещё два слепых сторожа. Слить ветвь дней с ветвью состава можно + было, не уронив ни одного из 297 тестов. +- Цифры: ревью 68 команд, 3 находки (1 MAJOR завышен — сценарий требует + сознательно снять флаг у массива, 2 MINOR); перепроверка на medium — 12 + команд; батарея 17 мутантов, выживших нет.