Skip to main content

Cookbook: полная detection-цепочка с alarm-loop

Эталонный граф эпика basn (#323): аудиопоток анализируют два детектора, их слияние ветвит сценарий, тревога живёт пока цель «на дистанции», по выходу собирается единый отчёт. Все узлы — в палитре, отдельного alarm-механизма нет: цепочка целиком собирается композицией.

Граф

Checklist

1

Два независимых детектора

trends-FFT (CollectFftFramesMakeFftTrendsAnalysis) и DSP-ансамбль (CollectSamplesMakeEnsembleAnalysis). 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-семантика

  1. Детекторы исполняются хостом (ансамбль — detection-ensemble-service на клиенте), узлы stateless; серии proximity копятся на хосте per nodeId и сбрасываются на Пуске.
  2. Fusion и branch — чистые узлы (@membrana/core), host не нужен.
  3. 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.