# IH-21 финал: эффект expert notes на реальной плате (A/B, 2026-09-20)

Модель: **zai-org/glm-4.7-flash** (LM Studio, локально). Плата: ESP32 + BME280, COM6,
MicroPython v1.27.0. Каждая рука: 4 попытки × до 5 итераций «код → заливка → ответ платы →
правка». Интерлив попыток (notes-1, bare-1, notes-2, …) — дрейф стенда бьёт по рукам одинаково.
Честность: `error_kind` в каждом результате (infra/run/timeout/none); notes фиксируются в
results.jsonl-поле эксперимента; стенда-критерии не менялись в течение серии.

## Вердикт

**Expert notes дают крупный измеримый эффект на real-задачах среднего уровня сложности:
solve 4/4 с первой итерации против 2/4 с полным исчерпанием бюджета; ~10× по времени руки.**
На слишком трудной задаче (level 4) эффект неизмерим — потолок модели; на слишком лёгкой
(level 1) — неизмерим сверху. Практика: real-задачи уровня 2-4 обязаны нести 3-5 строк
notes живого стенда в solve-промпте.

## Три точки кривой сложности

| задача | уровень | notes | bare | вывод |
|---|---|---|---|---|
| bme-read (BME280-драйвер с нуля) | 4 | 0/1, 5 итераций, kind=none | 0/1, 5 итераций, kind=none | стена: потолок модели, эффект неизмерим |
| uart-menu (FSM с подрежимами) | 3 | **4/4, итерации [1,1,1,1], ~7 мин/рука** | **2/4, [5,5,5,1], 2 честных FAIL, ~73 мин/рука** | **эффект виден во всю** |
| uart-echo (эхо строк) | 1 | 4/4, [1,1,1,1], 39-46 с | 4/4, [1,1,1,1], 58-114 с | потолок: обе руки идеальны |

Разбор uart-menu (контрастная точка):
- **notes** (3 строки: «консоль = USB REPL, input()/print(), machine.UART не подключён»,
  «input() без хвостового \n», «метки матчатся буквально») — каждая попытка решает с
  **первой** итерации: 146/97/112/70 с.
- **bare** — 2 попытки сожгли все 5 итераций и кончили честным FAIL (kind=run, бюджет
  исчерпан), 2 решённые потребили по 5 итераций (1140-1620 с); единственный solve с 1-й
  итерации (attempt-4) — удача сэмплинга, не сигнал.

## Границы применимости (честно)

- bme-read: цепочка 4b (kind=run) → 7b (честный ноль, 2026-09-16) → glm (честный ноль,
  2026-09-20). Бутылочное горлышко glm — выдаёт код в 1-2 итерациях из 5 (reasoning съедает
  ответ без python-блока), остальное — баги одного класса (IndexError/ValueError в распаковке
  калибровки). Notes-прошивка структурно грамотнее, но тот же класс багов.
- reactive-читер на bme-read по-прежнему теоретически возможен (печать правдоподобных
  констант после запроса) — лечится cross-sensor задачей (DS18B20 vs BME280).
- Серия — одна модель, один стенд, один день; n=4 на руку. Сильный эффект (p очевиден
  невооружённо: 4/4×итерация-1 против 2/4×итерация-5), но генерализация на другие модели —
  работа будущих кампаний.

## Инфраструктурный инцидент серии (закрыт в тот же день)

Первый запуск A/B 2026-09-20: обе руки infra-FAIL «did not enter paste mode». Причина — не
среда, а наш баг: бэкап-проба IH-79 (мультистрочный try/except в cooked REPL) никогда не
исполнялась — cooked REPL автоиндентит после двоеточия, блок тонул в редакторе, Ctrl+D/Ctrl+E
были мертвы. Фикс: проба однострочными colon-free выражениями + 3 регрессионных теста
(инвариант «cooked-записи без двоеточий», BlockSink-фейк через _backup_main и через полный
boot()). Ревью: approve с эмпирическим подтверждением красноты тестов на старом коде.
PR #90 (IH-88), PR #91 (IH-89, notes задач). Урок: новая cooked-заливка = живой смоук ДО
кампании; офлайн-фейки автоиндент не моделируют.

## Артефакты

- Деревья: `.ironbench/campaigns/2026-09-20-real-ab{,-uart-echo,-uart-menu}/zai-org_glm-4.7-flash/`
  (прошивки всех итераций, serial-логи, run-каталоги).
- Логи драйвера: `tmp/ab_run_glm47_v3.log`, `tmp/ab_run_glm47_uart-echo.log`, `tmp/ab_run_glm47_uart-menu.log`.
- Валидация среды перед серией: `uv run pytest` 649+ passed, ruff clean; скан I2C [118] (BME280).
- Восстановление стенда после серии: meteo main.py возвращён (3787 байт), serial_reset, модель выгружена.
