diff --git a/bible-local/decisions/2026-03-15-sensor-location-removed.md b/bible-local/decisions/2026-03-15-sensor-location-removed.md new file mode 100644 index 0000000..6cd3990 --- /dev/null +++ b/bible-local/decisions/2026-03-15-sensor-location-removed.md @@ -0,0 +1,7 @@ +# 2026-03-15 - Sensor Payloads Do Not Use Location + +- Date: `2026-03-15` +- Decision: Hardware sensor payloads (`sensors.fans`, `sensors.power`, `sensors.temperatures`, `sensors.other`) must not include `location`. Sensor identity is limited to `(sensor_type, name)`. +- Context: In Reanimator, `location` / `slot` is meaningful for component installation state and movement checks. Sensor ingest is a last-known-value projection and does not participate in installation tracking, so a location field creates false semantics and encourages integrators to send misleading coordinates. +- Consequences: The external hardware ingest contract must remove `location` from all sensor sections and examples. Integrators should send only the sensor `name` plus measured values/status. Any future need to relate a reading to a component must be modeled explicitly, not via free-form sensor location strings. +- Supersedes: Implicit optional `location` in sensor sections of `bible-local/docs/hardware-ingest-contract.md`. diff --git a/bible-local/docs/hardware-ingest-contract.md b/bible-local/docs/hardware-ingest-contract.md index cf6b5b5..33a3ace 100644 --- a/bible-local/docs/hardware-ingest-contract.md +++ b/bible-local/docs/hardware-ingest-contract.md @@ -1,6 +1,6 @@ --- title: Hardware Ingest JSON Contract -version: "2.7" +version: "2.8" updated: "2026-03-15" maintainer: Reanimator Core audience: external-integrators, ai-agents @@ -9,7 +9,7 @@ language: ru # Интеграция с Reanimator: контракт JSON-импорта аппаратного обеспечения -Версия: **2.7** · Дата: **2026-03-15** +Версия: **2.8** · Дата: **2026-03-15** Документ описывает формат JSON для передачи данных об аппаратном обеспечении серверов в систему **Reanimator** (управление жизненным циклом аппаратного обеспечения). Предназначен для разработчиков смежных систем (Redfish-коллекторов, агентов мониторинга, CMDB-экспортёров) и может быть включён в документацию интегрируемых проектов. @@ -22,6 +22,7 @@ language: ru | Версия | Дата | Изменения | |--------|------|-----------| +| 2.8 | 2026-03-15 | Поле `location` удалено из всех `sensors.*`; сенсоры передаются только по `name` и измеренным значениям | | 2.7 | 2026-03-15 | Явно запрещён синтез данных в `event_logs`; интеграторы не должны придумывать серийные номера компонентов, если источник их не отдал | | 2.6 | 2026-03-15 | Добавлена необязательная секция `event_logs` для dedup/upsert логов `host` / `bmc` / `redfish` вне history timeline | | 2.5 | 2026-03-15 | Добавлено общее необязательное поле `manufactured_year_week` для компонентных секций (`YYYY-Www`) | @@ -592,7 +593,6 @@ PSU без `serial_number` игнорируется. | Поле | Тип | Обязательно | Описание | |------|-----|-------------|----------| | `name` | string | **да** | Уникальное имя сенсора в рамках секции | -| `location` | string | нет | Физическое расположение | | `rpm` | int | нет | Обороты, RPM | | `status` | string | нет | Статус: `OK`, `Warning`, `Critical`, `Unknown` | @@ -601,7 +601,6 @@ PSU без `serial_number` игнорируется. | Поле | Тип | Обязательно | Описание | |------|-----|-------------|----------| | `name` | string | **да** | Уникальное имя сенсора | -| `location` | string | нет | Физическое расположение | | `voltage_v` | float | нет | Напряжение, В | | `current_a` | float | нет | Ток, А | | `power_w` | float | нет | Мощность, Вт | @@ -612,7 +611,6 @@ PSU без `serial_number` игнорируется. | Поле | Тип | Обязательно | Описание | |------|-----|-------------|----------| | `name` | string | **да** | Уникальное имя сенсора | -| `location` | string | нет | Физическое расположение | | `celsius` | float | нет | Температура, °C | | `threshold_warning_celsius` | float | нет | Порог Warning, °C | | `threshold_critical_celsius` | float | нет | Порог Critical, °C | @@ -623,29 +621,29 @@ PSU без `serial_number` игнорируется. | Поле | Тип | Обязательно | Описание | |------|-----|-------------|----------| | `name` | string | **да** | Уникальное имя сенсора | -| `location` | string | нет | Физическое расположение | | `value` | float | нет | Значение | | `unit` | string | нет | Единица измерения | | `status` | string | нет | Статус | **Правила sensors:** - Идентификатор сенсора: пара `(sensor_type, name)`. Дубли в одном payload — берётся первое вхождение. +- `location` для сенсоров передавать не нужно и не следует: в Reanimator location/slot используется только для проверки перемещения и установки компонентов, а не для last-known-value sensor ingest. - Сенсоры без `name` игнорируются. - При каждом импорте значения перезаписываются (upsert по ключу). ```json "sensors": { "fans": [ - { "name": "FAN1", "location": "Front", "rpm": 4200, "status": "OK" }, - { "name": "FAN_CPU0", "location": "CPU0", "rpm": 5600, "status": "OK" } + { "name": "FAN1", "rpm": 4200, "status": "OK" }, + { "name": "FAN_CPU0", "rpm": 5600, "status": "OK" } ], "power": [ - { "name": "12V Rail", "location": "Mainboard", "voltage_v": 12.06, "status": "OK" }, - { "name": "PSU0 Input", "location": "PSU0", "voltage_v": 215.25, "current_a": 0.64, "power_w": 137.0, "status": "OK" } + { "name": "12V Rail", "voltage_v": 12.06, "status": "OK" }, + { "name": "PSU0 Input", "voltage_v": 215.25, "current_a": 0.64, "power_w": 137.0, "status": "OK" } ], "temperatures": [ - { "name": "CPU0 Temp", "location": "CPU0", "celsius": 46.0, "threshold_warning_celsius": 80.0, "threshold_critical_celsius": 95.0, "status": "OK" }, - { "name": "Inlet Temp", "location": "Front", "celsius": 22.0, "threshold_warning_celsius": 40.0, "threshold_critical_celsius": 50.0, "status": "OK" } + { "name": "CPU0 Temp", "celsius": 46.0, "threshold_warning_celsius": 80.0, "threshold_critical_celsius": 95.0, "status": "OK" }, + { "name": "Inlet Temp", "celsius": 22.0, "threshold_warning_celsius": 40.0, "threshold_critical_celsius": 50.0, "status": "OK" } ], "other": [ { "name": "System Humidity", "value": 38.5, "unit": "%", "status": "OK" }