Перейти к содержимому
Экосистема AI Vibe

Разборы

BlocSignal: reactive primitives против «налога» codegen в agent loop

Редакция 14 сентября 2026 г.

BlocSignal: reactive primitives против «налога» codegen в agent loop

Три режима трения в одном agent loop на Cursor: правка поля → семь слоёв архитектуры → build_runner watch 15–45 секунд; правка поля → холодная сборка около пяти минут; async-тесты без синхронного TDD в «кадре ноль». Schwartz (Google Developer Experts) в разборе продаёт BlocSignal как RISC-ответ; на третьем этапе rollout Cursor стоит рядом с Claude Code и Copilot.

Когда агент упирается в «CISC ceremony»

Правка bool-свойства в UI: событие через трансформер, StreamController, microtask, UseCase, Repository, обратно в state stream. Clean Architecture плюс Stream BLoC (2019–2023) так задуманы. Человек ждёт; агент в IDE копит лишние файлы, ловит flaky async-тесты и простаивает, пока кодогенерация догоняет diff.

Schwartz называет связку CISC ceremony. Цифры его, не бенчмарк редакции: build_runner watch 15–45 секунд после простого изменения; flutter clean и холодная пересборка около пяти минут; codegen в CI 4–8 минут. Плюс merge conflicts в .g.dart / .freezed.dart и порча кэша .dart_tool/build.

BlocSignal, signals v7 и push-pull

BlocSignal: Dart/Flutter-пакеты, границы BLoC плюс push-pull signals на Preact Signals (version 7) из signals (Rody Davis). Монорепозиторий: bloc_signals, bloc_signals_bloc, bloc_signals_riverpod, bloc_signals_otel, bloc_signals_devtools, bloc_signals_lint, bloc_signals_hydrate, bloc_signals_replay, bloc_signals_jaspr. Flutter enterprise mobile/desktop, не универсальный JS-фреймворк.

Примитив Роль
signal Синхронная in-frame ячейка состояния
computed Мемоизированная ленивая производная
effect Side-effect с авто-трекингом зависимостей
CubitSignal / BlocSignal Границы unidirectional data flow

«Code-gen tax» снимают structural equality и copy-on-write через Fast Immutable Collections (fast_immutable_collections, IList/IMap) без generated code. В сводной таблице BlocSignal выше классического BLoC 8/9 и Riverpod v2/v3 по propagation, реактивности, codegen, lifecycle scoping и скорости для агента (Low / Medium / High).

Eager-Dirty / Lazy-Pull (Preact Signals, SolidJS, Angular Signals):

  1. Push phase: signal изменился, downstream computed() помечаются stale, без вычислений.
  2. Pull phase: пересчёт только при чтении .value активным виджетом, один раз в топологическом порядке.

Riverpod с eager-push пересчитывает весь downstream сразу, включая off-screen узлы; diamond-glitch и cold reload на autoDispose. «The Pet's Pet»: computed() на контейнере для fan-in/fan-out без RxDart. В agent loop меньше скрытых пересчётов: синхронный граф вместо async-стримов по дереву.

Cursor, skills, мосты и пилот

Phase 3 rollout: Claude Code, Cursor, Copilot, Antigravity для бизнес-логики и unit-тестов на CubitSignal / blocSignalTest. В монорепозитории готовые skills: plugins/bloc-signals/skills/bloc-signals/ и .agents/skills/ (decision matrix, sync testing, widget bindings). Iceberg Pattern и синхронный TDD в frame 0: меньше контекста на diff, меньше файлов за ход агента.

«3x velocity multiplier» Schwartz не подкрепляет методикой. Соло на Cursor: если циклы уходят на codegen и разбор семи слоёв, синхронные примитивы и skills в репозитории могут снять трение; «3x» маркетинг, не замер.

Мосты без «hostage»:

  • bloc_signals_bloc: toCubit(), BlocBuilder для flutter_bloc
  • bloc_signals_riverpod: toBlocSignal, warm state для Riverpod
  • toValueListenable() для AnimatedBuilder / GoRouter

Пилот на одном экране, четыре фазы (pilot → FIC → AI velocity → DevTools/OTel/lints).

Schwartz заявляет 100,0% line test coverage (CI gate); 16 портированных production apps, >100 000 operations/second, zero memory leaks; 20 static analysis lints и 8 IDE quick-fixes (bloc_signals_lint); OpenTelemetry (bloc_signals_otel), DevTools extension, hydrate, replay, Jaspr web. Независимых бенчмарков BlocSignal против Riverpod/BLoC вне его монорепо нет. Open-source Flutter-экосистема; коммерческий SaaS Schwartz не описывает.

Синхронные примитивы, push-pull и .agents/skills/ стоит проверить на своём модуле, если агент в Cursor тратит ходы на ожидание codegen. Цифры latency и «3x» его оценки, не проверка редакции.

Источники

  • Randal L. Schwartz (Google Developer Experts), «The Modern Pitch for BlocSignal: Why Engineering Leads Are Moving to Reactive Primitives» — Dev.to (доступ: 2026-09-10)
  • Метаданные поста Dev.to: опубликовано 2026-09-09, 7 реакций, 1 комментарий, время чтения 15 мин