Cookbook: полная detection-цепочка с alarm-loop
Эталонный граф эпика basn (#323): аудиопоток анализируют два детектора, их слияние ветвит сценарий, тревога живёт пока цель «на дистанции», по выходу собирается единый отчёт. Все узлы — в палитре, отдельного alarm-механизма нет: цепочка целиком собирается композицией.Граф
Checklist
1
Два независимых детектора
trends-FFT (
CollectFftFrames → MakeFftTrendsAnalysis) и DSP-ансамбль
(CollectSamples → MakeEnsembleAnalysis). Fusion принимает 2–4 анализа.2
Ветвление только по fusion
BranchOnDetection читает combinedScore ≥ threshold (дефолт 0.5). Молчащий
fusion → not-detected, тревога не стартует от пустого входа.3
Жизнь alarm-loop = валидность proximity
MakeProximityTrend возвращает ProximityRef, невалидный при lost. Выход из
лупа — is-valid + loop-repeat, отдельного branch-узла нет.4
Один отчёт на тревогу
MakeCombinedReport идемпотентен по входам — повторные exec не плодят дубли;
тяжёлая упаковка уходит в async job report-build.5
Публикация отдельно
PublishReport в тот же journal, к которому scoped ReporterRef.Runtime-семантика
- Детекторы исполняются хостом (ансамбль —
detection-ensemble-serviceна клиенте), узлы stateless; серии proximity копятся на хосте per nodeId и сбрасываются на Пуске. - Fusion и branch — чистые узлы (
@membrana/core), host не нужен. - Async job
report-buildне блокирует рантайм — сценарий продолжает жить, пока host пакует отчёт.
Узлы цепочки
MakeEnsembleAnalysis · MakeDetectionFusion · BranchOnDetection · MakeProximityTrend · MakeCombinedReport Источники:packages/device-board/src/runtime/combined-report-executor.test.ts
(эпик-smoke полной цепочки) · docs/prompts/BOARD_ALARM_SCENARIO_NODES_EPIC_PROMPT.md.