# KQIP 0.2 · R3-draft

> Сгенерировано из registry.json. Исправленный проектный контракт; работоспособность MCU/TLS не заявлена.

## Общие пределы

| Параметр | Значение |
|---|---|
| `header_bytes` | 24 |
| `body_bytes` | 4096 |
| `depth` | 8 |
| `map_items` | 32 |
| `array_items` | 256 |
| `text_bytes` | 128 |
| `byte_string_bytes` | 1024 |
| `extension_key_min` | 128 |
| `extension_key_max` | 255 |

## Коды ошибок

| Код | Имя |
|---|---|
| 0 | `OK` |
| 1 | `UNAUTHORIZED` |
| 2 | `BOOT_MISMATCH` |
| 3 | `FENCE_MISMATCH` |
| 4 | `ID_CONFLICT` |
| 5 | `RESULT_EVICTED` |
| 6 | `INVALID_VALUE` |
| 7 | `MANUAL_HOLD` |
| 8 | `STATE_CONFLICT` |
| 9 | `EXPIRED` |
| 10 | `RESOURCE_LIMIT` |
| 11 | `UNKNOWN_COMMAND` |
| 12 | `PROFILE_MISMATCH` |
| 13 | `INVALID_FRAME` |
| 14 | `SYNC_REQUIRED` |
| 15 | `STORAGE_FAILURE` |

## Hello · 0x0001

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `profile` | `type="uint", minimum=2, maximum=2, const=2` |
| 2 | `installation_id` | `type="bytes", length=16` |
| 3 | `peer_id` | `type="bytes", length=16` |
| 4 | `boot_id` | `type="bytes", length=16` |
| 5 | `role` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[1, 2]` |
| 6 | `max_body` | `type="uint", minimum=256, maximum=4096` |
| 7 | `capabilities` | `type="array", max_items=16, items={"name": "value", "type": "uint", "minimum": 0, "maximum": 18446744073709551615}` |

## Ready · 0x0002

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `profile` | `type="uint", minimum=2, maximum=2, const=2` |
| 2 | `reply_to` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 3 | `accepted` | `type="bool"` |
| 4 | `max_body` | `type="uint", minimum=256, maximum=4096` |

## Describe · 0x0010

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `device_id` | `type="bytes", length=16` |
| 2 | `descriptor_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 3 | `channels` | `type="array", max_items=16, items={"type": "ref", "ref": "ChannelDescriptor"}` |
| 4 | `reply_to` | `type="uint", minimum=0, maximum=18446744073709551615` |

## Snapshot · 0x0011

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `device_id` | `type="bytes", length=16` |
| 2 | `channel_id` | `type="uint", minimum=0, maximum=65535` |
| 3 | `boot_id` | `type="bytes", length=16` |
| 4 | `controller_fence` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 5 | `output_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 6 | `manual_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 7 | `output` | `type="bool"` |
| 8 | `manual_mode` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[0, 1, 2]` |
| 9 | `execution_highwater` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 10 | `sample_device_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 11 | `reply_to` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 12 | `descriptor_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |

## Observation · 0x0020

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `device_id` | `type="bytes", length=16` |
| 2 | `channel_id` | `type="uint", minimum=1, maximum=65535` |
| 3 | `boot_id` | `type="bytes", length=16` |
| 4 | `sample_seq` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 5 | `sample_start_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 6 | `sample_end_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 7 | `mantissa` | `type="int", minimum=-9223372036854775808, maximum=9223372036854775807` |
| 8 | `exponent` | `type="int", minimum=-6, maximum=3` |
| 9 | `unit` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[1, 2, 3]` |
| 10 | `status` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[0, 1, 2]` |
| 11 | `flags` | `type="uint", minimum=0, maximum=7` |
| 12 | `descriptor_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 13 | `placement_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 14 | `mode_id` | `type="uint", minimum=0, maximum=65535` |
| 15 | `delivery_kind` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[0, 1]` |

## Event · 0x0021

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `device_id` | `type="bytes", length=16` |
| 2 | `channel_id` | `type="uint", minimum=0, maximum=65535` |
| 3 | `boot_id` | `type="bytes", length=16` |
| 4 | `sample_seq` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 5 | `device_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 6 | `event_kind` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[1, 2, 3]` |
| 7 | `value` | `type="bool_or_uint"` |
| 8 | `delivery_kind` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[0, 1]` |

Условные ограничения:

```json
[
  {
    "if": {
      "field": 6,
      "equals": 3
    },
    "then": {
      "field": 7,
      "type": "uint"
    }
  },
  {
    "if": {
      "field": 6,
      "in": [
        1,
        2
      ]
    },
    "then": {
      "field": 7,
      "type": "bool"
    }
  }
]
```

## Command · 0x0030

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `command_id` | `type="bytes", length=16` |
| 2 | `target_device_id` | `type="bytes", length=16` |
| 3 | `channel_id` | `type="uint", minimum=1, maximum=65535` |
| 4 | `expected_boot_id` | `type="bytes", length=16` |
| 5 | `controller_fence` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 6 | `execution_seq` | `type="uint", minimum=1, maximum=18446744073709551615` |
| 7 | `expected_output_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 8 | `expected_manual_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 9 | `not_after_device_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 10 | `operation` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[1, 2]` |
| 11 | `argument` | `type="bool_or_null"` |
| 12 | `cause` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[0, 1]` |

Условные ограничения:

```json
[
  {
    "if": {
      "field": 10,
      "equals": 1
    },
    "then": {
      "field": 11,
      "type": "bool"
    }
  },
  {
    "if": {
      "field": 10,
      "equals": 2
    },
    "then": {
      "field": 11,
      "type": "null"
    }
  },
  {
    "if": {
      "field": 10,
      "equals": 2
    },
    "then": {
      "field": 12,
      "equals": 1
    }
  }
]
```

## CommandResult · 0x0031

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `command_id` | `type="bytes", length=16` |
| 2 | `boot_id` | `type="bytes", length=16` |
| 3 | `execution_seq` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 4 | `status` | `type="uint", minimum=0, maximum=18446744073709551615, enum=[1, 2], reserved=[3]` |
| 5 | `error_code` | `type="uint", minimum=0, maximum=65535, enum=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]` |
| 6 | `output_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 7 | `manual_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 8 | `output_at_result` | `type="bool"` |
| 9 | `result_device_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 10 | `controller_fence` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 11 | `reply_to` | `type="uint", minimum=0, maximum=18446744073709551615` |

Условные ограничения:

```json
[
  {
    "if": {
      "field": 4,
      "equals": 1
    },
    "then": {
      "field": 5,
      "equals": 0
    }
  },
  {
    "if": {
      "field": 4,
      "equals": 2
    },
    "then": {
      "field": 5,
      "not_equals": 0
    }
  }
]
```

## StatusQuery · 0x0032

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `command_id` | `type="bytes", length=16` |
| 2 | `target_device_id` | `type="bytes", length=16` |
| 3 | `channel_id` | `type="uint", minimum=0, maximum=65535` |
| 4 | `expected_boot_id` | `type="bytes", length=16` |

## Resync · 0x0033

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `target_device_id` | `type="bytes", length=16` |
| 2 | `channel_id` | `type="uint", minimum=0, maximum=65535` |
| 3 | `known_boot_id` | `type="bytes", length=16` |
| 4 | `known_output_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 5 | `known_manual_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 6 | `known_descriptor_revision` | `type="uint", minimum=0, maximum=18446744073709551615` |

## Ping · 0x0040

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `nonce` | `type="bytes", length=16` |
| 2 | `core_boot_id` | `type="bytes", length=16` |
| 3 | `c1_us` | `type="uint", minimum=0, maximum=18446744073709551615` |

## Pong · 0x0041

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `nonce` | `type="bytes", length=16` |
| 2 | `core_boot_id` | `type="bytes", length=16` |
| 3 | `device_boot_id` | `type="bytes", length=16` |
| 4 | `c1_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 5 | `d2_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 6 | `d3_us` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 7 | `clock_mode` | `type="uint", minimum=0, maximum=65535` |
| 8 | `reply_to` | `type="uint", minimum=0, maximum=18446744073709551615` |

## TelemetryAck · 0x0042

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `device_id` | `type="bytes", length=16` |
| 2 | `channel_id` | `type="uint", minimum=0, maximum=65535` |
| 3 | `boot_id` | `type="bytes", length=16` |
| 4 | `durable_through_seq` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 5 | `credit` | `type="uint", minimum=0, maximum=256` |

## Error · 0x00FF

Все перечисленные поля обязательны.

| Ключ | Имя | Тип и ограничения |
|---|---|---|
| 1 | `error_code` | `type="uint", minimum=0, maximum=65535, enum=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]` |
| 2 | `reply_to` | `type="uint", minimum=0, maximum=18446744073709551615` |
| 3 | `diagnostic` | `type="text", max_bytes=128` |

## Политики и ограничения

```json
{
  "manual_mode": "indefinite HOLD; explicit RELEASE_MANUAL; reboot BOOT_INHIBIT",
  "unknown_result": "CommandResult status3 reserved; StatusQuery unknown returns Error UNKNOWN_COMMAND; no fabricated historical fields",
  "unsolicited_snapshot": "reply_to=0",
  "event_provenance": "wire0.2 relocation needs explicit admission barrier; richer Event requires future profile"
}
```

`CommandResult.status=3` зарезервирован. Неизвестный ID возвращает `Error/UNKNOWN_COMMAND`; известное вытеснение — `RESULT_EVICTED`. Это уточнение draft, не свидетельство совместимости с любой трактовкой R2.

JSON Schema проверяет диагностическую форму; UTF-8 byte count, CBOR depth, нормализация decimal, интервал измерения и состояние соединения требуют дополнительных проверок.
