STEP 1593 — Signal/Device 2 層化 Phase 1 Pilot

STEP 1593 · STEP 1536 spec の 具体化 実装、 別 tab STEP 1571 no-data-primitives 上位 補完 · Rei-AIOS · 2026-08-30 · commit 1cb768411

要旨

benchtop-mcp Signal/Device 2 層化 Phase 1 pilot 実装 (STEP 1536 spec の 具体化 第 1 段)。 別 tab STEP 1571 no-data-primitives.ts (Ophyd NotConnectedError 2-layer distinction) を 認識 + 上位 Signal/Device interface layer を 追加 = 補完 role で collision zero。 pilot example = createDiskHealthDevice() (STEP 1567 disk_health_verdict adapter、 backward compat 完全維持)。

2 層 architecture (実装)

LayerType + FactoryQuality range
L1 SignalSignal<T> + createValueSignal({name, unit, fetcher, inRange, connectedProbe}){TRUE, NEITHER, INFINITY, ZERO}
L2 DeviceDevice + createVerdictDevice({name, signals, verdictComputer})full 8 値 (BOTH / FLOWING / SELF 含む)
PilotcreateDiskHealthDevice({smartReader, thresholds})STEP 1567 5-case (TRUE/NEITHER/FALSE/INFINITY/ZERO)

Signal factory quality logic

createValueSignal({name, fetcher, inRange, connectedProbe})
  → SignalReading<T> {value, timestamp, quality, detail?}

Quality mapping:
  fetcher returns undefined / null  → ZERO      (STEP 1571 SensorNoData 相当、 Ophyd NotConnectedError)
  fetcher throws                     → NEITHER   (read attempted but failed、 detail に exception message)
  fetcher returns value + inRange OK → TRUE
  fetcher returns value + out of range → INFINITY (sensor-limit-exceeded、 value 保持で audit 可能)

Device factory quality propagation

createVerdictDevice({name, signals, verdictComputer})
  → DeviceVerdict {device, verdict, reason, signalReadings, timestamp}

Propagation rules:
  1. All signals ZERO → device ZERO (no_data、 Ophyd NotConnectedError propagation)
  2. Any INFINITY + verdictComputer returns TRUE → auto-promote to INFINITY
  3. verdictComputer が INFINITY 認識 or FALSE (safety) 返す → verdictComputer 尊重
  4. Otherwise → verdictComputer delegate for full 8 値 range

Test coverage (32/32 PASS)

Honest scope (Phase 1 spike)

Related