File size: 29,195 Bytes
4ebcb49
 
0e87626
 
 
4ebcb49
 
4426ada
767e7a3
 
4426ada
767e7a3
 
4ebcb49
 
 
 
0e87626
 
 
d9a9eac
4ebcb49
 
0e87626
 
4ebcb49
 
 
 
 
 
0e87626
 
 
4ebcb49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1476ff0
4ebcb49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee875cc
 
4ebcb49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e87626
 
 
ee875cc
1476ff0
 
4ebcb49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e87626
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4ebcb49
 
 
 
 
d9a9eac
4ebcb49
d9a9eac
45908d6
 
4ebcb49
 
 
0e87626
 
 
 
4ebcb49
0e87626
 
4ebcb49
0e87626
4ebcb49
 
 
0e87626
4ebcb49
0e87626
 
 
 
 
 
 
 
 
4ebcb49
 
 
0e87626
4ebcb49
0e87626
 
4ebcb49
0e87626
4ebcb49
 
 
0e87626
 
 
 
 
 
 
ee875cc
 
 
 
45908d6
 
 
 
ee875cc
45908d6
 
 
 
 
 
ee875cc
45908d6
 
 
 
 
 
 
 
ee875cc
 
45908d6
ee875cc
 
 
 
 
45908d6
 
ee875cc
 
45908d6
 
 
ee875cc
45908d6
ee875cc
 
 
 
 
 
 
 
 
 
 
 
 
45908d6
ee875cc
 
 
 
 
45908d6
ee875cc
 
 
45908d6
 
 
0e87626
1476ff0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4ebcb49
 
 
 
 
 
 
 
 
 
0e87626
4ebcb49
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
---
title: 🧩 HMP Container Specification (v1.2-draft)
description: '> ⚠️ **ВНИМАНИЕ:** Данная версия спецификации является черновиком для
  [HMP-0005.md](HMP-0005.md). > > После утверждения пятой версии протокола будет зафиксирована
  как стабильная `v1.2`.  ## 1. Назначе...'
type: Article
tags:
- REPL
- Ethics
- Mesh
- JSON
- HMP
- Agent
---

# 🧩 HMP Container Specification (v1.2-draft)

> ⚠️ **ВНИМАНИЕ:** Данная версия спецификации является черновиком для [HMP-0005.md](HMP-0005.md).
>
> После утверждения пятой версии протокола будет зафиксирована как стабильная `v1.2`.

## 1. Назначение

Документ описывает универсальный формат **контейнера HMP**, применяемый для передачи и хранения всех типов данных внутри сети **HyperCortex Mesh Protocol (HMP)**.  
Контейнеры служат стандартной оболочкой для сообщений, целей, репутационных профилей, консенсусных голосований, писем и других сущностей.

Единая структура контейнера обеспечивает:

* унификацию передачи данных между агентами;
* расширяемость без изменения базового протокола;
* возможность криптографической подписи и проверки целостности;
* независимое хранение и маршрутизацию смысловых блоков;
* поддержку сжатия и шифрования полезной нагрузки.


---

## 2. Общая структура контейнера

```json
{
  "hmp_container": {
    "version": "1.2",
    "class": "goal" | "reputation" | "knowledge_node" | "ethics_case" | "protocol_goal" | ...,
    "class_version": "1.0",
    "class_id": "goal-v1.0",
    "container_did": "did:hmp:container:abc123",
    "schema": "https://mesh.hypercortex.ai/schemas/container-v1.json",
    "sender_did": "did:hmp:agent123",
    "public_key": "BASE58(...)",
    "recipient": ["did:hmp:agent456", "did:hmp:agent789"],
    "broadcast": false,
    "network": "",
    "tags": ["research", "collaboration"],
    "timestamp": "2025-10-10T15:32:00Z",
    "ttl": "2025-11-10T00:00:00Z",
    "sig_algo": "ed25519",
    "signature": "BASE64URL(...)",
    "compression": "zstd",
    "payload_type": "json",
    "payload_hash": "sha256:abcd...",
    "payload": {
      /* Содержимое зависит от class */
    },
    "related": {
      "previous_version": "did:hmp:container:abc122",
      "in_reply_to": "did:hmp:container:msg-77",
      "see_also": ["did:hmp:container:ctx-31", "did:hmp:container:goal-953"]
    },
    "relations": [
      { "type": "depends_on", "target": "did:hmp:container:goal-953" }
    ],
    "magnet_uri": "magnet:?xt=urn:sha256:abcd1234..."
  },
  "referenced-by": ["did:hmp:container:ctx-34", "did:hmp:container:goal-945"]
}
```

---

## 3. Обязательные поля

| Поле            | Тип      | Назначение                                                                                        |
| --------------- | -------- | ------------------------------------------------------------------------------------------------- |
| `version`       | string   | Версия спецификации контейнера                                                                    |
| `class`         | string   | Тип содержимого (`goal`, `reputation`, `knowledge_node`, `ethics_case`, `protocol_goal` и т.п.)   |
| `class_version` | string   | Версия конкретного класса                                                                         |
| `class_id`      | string   | Уникальный идентификатор класса (обычно формируется как `<class>_v<class_version>`)               |
| `container_did` | string   | DID самого контейнера (например, `did:hmp:container:abc123`)                                      |
| `schema`        | string   | Ссылка на JSON Schema, по которой валидируется контейнер                                          |
| `sender_did`    | string   | DID-идентификатор отправителя                                                                     |
| `timestamp`     | datetime | Время создания контейнера                                                                         |
| `payload_hash`  | string   | Хэш распакованной полезной нагрузки                                                               |
| `sig_algo`      | string   | Алгоритм цифровой подписи (по умолчанию `ed25519`)                                                |
| `signature`     | string   | Цифровая подпись контейнера                                                                       |
| `payload_type`  | string   | Тип данных полезной нагрузки (`json`, `binary`, `mixed`)                                          |
| `payload`       | object   | Основное содержимое контейнера                                                                    |

---

## 4. Опциональные поля

| Поле                       | Тип           | Описание                                                                     |
| -------------------------- | ------------- | ---------------------------------------------------------------------------- |
| `recipient`                | array(string) | Один или несколько DID-адресатов                                             |
| `broadcast`                | bool          | Флаг широковещательной рассылки (если `true`, поле `recipient` игнорируется) |
| `tags`                     | array(string) | Тематические теги контейнера                                                 |
| `ttl`                      | datetime      | Срок актуальности (контейнер не передаётся после истечения)                  |
| `public_key`               | string        | Публичный ключ отправителя, если нет глобальной привязки к DID               |
| `compression`              | string        | Алгоритм сжатия полезной нагрузки (`zstd`, `gzip`)                           |
| `magnet_uri`               | string        | Magnet-ссылка на оригинал или зеркала контейнера                             |
| `related.previous_version` | string        | Ссылка на предыдущую версию контейнера                                       |
| `related.in_reply_to`      | string        | Контейнер, на который дан ответ                                              |
| `related.see_also`         | array(string) | Список связанных контейнеров для дополнительного контекста                   |
| `relations`                | array(object) | Семантические связи в виде пар `{ "type": "...", "target": "..." }`          |
| `encryption_algo`          | string        | Алгоритм шифрования полезной нагрузки                                        |
| `key_recipient`            | string        | DID получателя, для которого зашифрованы данные                              |
| `payload_type`             | string        | Может содержать сложные типы, например `encrypted+zstd+json`                 |
| `referenced-by`            | array(string) | Неподписываемое поле, формируемое агентом на основе полученных ссылок. Содержит список DID-контейнеров, которые ссылаются на данный. Может дополняться, поэтому требует проверки; используется для локальной навигации |
| `network`       | `string`        | Указывает локальную область распространения контейнера: `"localhost"`, `"lan:<subnet>"`. Пустая строка (`""`) означает интернет/глобальное распространение. Если задано, `broadcast` автоматически считается `false`. |

---

## 5. Структура полезной нагрузки (`payload`)

Полезная нагрузка содержит содержательные данные контейнера.
Тип и структура зависят от поля `class`.

Рекомендуемый формат описания полей:

```
- key: имя поля
  type: тип значения (JSON | TXT | BOOL | INT | FLOAT | ARRAY)
  description: краткое назначение
  required: true/false
  value: пример значения
```

**Пример:**

```
- key: "title"
  type: "TXT"
  required: true
  description: "Название цели"
  value: "Improve local agent discovery"

- key: "priority"
  type: "FLOAT"
  required: false
  description: "Важность задачи"
  value: 0.82

- key: "dependencies"
  type: "JSON"
  required: false
  description: "Список зависимостей других целей"
  value: ["goal-953", "goal-960"]
```

---

## 6. Подпись контейнера

1. Подписывается **весь JSON-объект `hmp_container`**, кроме поля `signature`.
2. По умолчанию используется алгоритм Ed25519.
3. При наличии поля `public_key` проверка подписи может выполняться без обращения к глобальной базе DID.
4. Агент, получивший контейнер, обязан сверить открытый ключ с известными данными DID-узлов, чтобы исключить подмену ключа.

   * Если агент не знает отправителя — он инициирует опрос соседних узлов о соответствии `sender_did → public_key`.

---

## 7. Сжатие (`compression`)

1. Поле `compression` указывает алгоритм сжатия полезной нагрузки.
2. Сжатие выполняется **до вычисления `payload_hash` и подписи**.
3. Для верификации контейнера полезная нагрузка должна быть распакована, затем вычисляется хэш и сверяется с `payload_hash`.

---

## 8. Шифрование (`encryption_algo`)

1. Если контейнер предназначен для конкретных получателей (`recipient`), допускается **гибридное шифрование** полезной нагрузки.
2. Алгоритм указывается в поле `encryption_algo`. Рекомендуемые значения:
   - `x25519-chacha20poly1305`
   - `rsa-oaep-sha256`
3. Порядок операций при создании зашифрованного контейнера:
   1. Сформировать `payload` (JSON, бинарные данные и т.д.)
   2. Сжать (`compression`)
   3. Зашифровать открытым ключом получателя (`public_key`)
   4. Вычислить `payload_hash` по зашифрованным данным
   5. Подписать контейнер (`signature`)
4. Для верификации структуры контейнера не требуется расшифровка,  
   но для проверки `payload_hash` и подписи — используется зашифрованная форма полезной нагрузки.
5. Поля:
   | Поле | Тип | Назначение |
   |------|-----|------------|
   | `encryption_algo` | string | Алгоритм шифрования |
   | `key_recipient` | string | DID получателя, для которого зашифрованы данные |
   | `payload_type` | string | Рекомендуется использовать префикс `encrypted+`, например `encrypted+zstd+json` |

---

## 9. Верификация контейнера

1. Проверить наличие обязательных полей.
2. Проверить корректность `timestamp` (не в будущем).
3. Если указано `ttl` — контейнер считается неактуальным по истечении этого времени.
4. Проверить хэш: вычислить `sha256(payload)` и сравнить с `payload_hash`.
5. Проверить цифровую подпись по алгоритму Ed25519 (если иное не указано в `sig_algo`).
6. Проверить допустимость схемы (`class` должен быть известным типом).
   * Для совместимости: если агент не распознаёт указанный `class`, но контейнер валиден по [базовой схеме](https://github.com/kagvi13/HMP/tree/main/docs/schemas/container-v1.2.json), он обязан сохранить и ретранслировать контейнер (режим **store & forward**). 
7. Рекомендуется периодически попытаться найти контейнеры, где текущий указан как `previous_version` — для обнаружения возможных обновлений.
8. При конфликте нескольких версий — действительной считается та, что получила подтверждение большинства доверенных узлов (консенсус на уровне DHT).

---

## 10. Контейнер как универсальное сообщение

Любой контейнер может выступать контекстом (`in_reply_to`) для другого контейнера.
Это позволяет использовать единую структуру для **обсуждений**, **голосований**, **писем**, **гипотез**, **аргументов** и других форм коммуникации.

Цепочки `in_reply_to` образуют **диалектическое дерево рассуждений**, в котором каждая ветвь отражает развитие мысли, уточнение позиции или контраргумент.
Таким образом, обсуждения и консенсусы в HMP имеют не линейную, а **многоуровневую и саморазвивающуюся структуру**.

> Таким образом, **все взаимодействия между агентами в HMP** представляют собой взаимосвязанную сеть контейнеров, формирующую **когнитивный граф рассуждений**.

---

## 11. Версионирование и преемственность

Контейнеры поддерживают эволюцию данных через поле `related.previous_version`.
Это позволяет отслеживать происхождение, обновления и смысловую преемственность.

* Потомок признаётся действительным, если его подпись совпадает с DID автора предыдущей версии.
* При расхождении подписи допустимо признание потомка легитимным при подтверждении не менее **⅔ доверенных узлов сети**.
  В этом случае право на дальнейшее развитие идеи фактически переходит сообществу — как форма коллективного владения смыслом.
* Агенты обязаны хранить как минимум одну предыдущую версию контейнера для совместимости и проверки целостной цепочки.
* Один контейнер может иметь несколько потомков (альтернативных ветвей), различающихся по дате или авторству; при необходимости приоритет определяется по консенсусу сети.
  Такие ветви рассматриваются как **смысловые форки** — параллельные линии развития одной идеи, существующие в рамках общего когнитивного графа.

---

## 12. TTL и актуальность

Поле `ttl` задаёт срок актуальности контейнера (например, для сообщений `DISCOVERY`).
Если `ttl` отсутствует — контейнер считается действительным **до появления новой версии**, в которой данный контейнер указан как `previous_version`.

По истечении срока действия контейнер сохраняется в архиве, но **не подлежит ретрансляции** в активной сети.

---

## 13. Расширяемость

* Разрешается добавление новых полей, не конфликтующих с существующими именами.
* Контейнеры старших версий должны оставаться читаемыми узлами, поддерживающими младшие версии.
* При появлении новых классов (`class`) они регистрируются в публичном реестре схем (`/schemas/container-types/`).
* Для контейнеров, описывающих **спецификации протоколов**, рекомендуется использовать префикс `protocol_`, за которым следует область применения (например, `protocol_goal`, `protocol_reputation`, `protocol_mesh_handshake` и т.п.).

---

## 14. Виртуальные обратные ссылки (`referenced-by`)

Каждый контейнер может иметь **дополнительный блок** `referenced-by`, указывающий, **какие другие контейнеры ссылаются на него**.  
Этот блок не является частью оригинального контейнера и передаётся как "прилепленный" (обособленный) атрибут.

### 14.1 Общие принципы

* **Не подписывается**`referenced-by` не включён в подпись контейнера и не влияет на его целостность.
* **Формируется и обновляется локально агентом** при анализе ссылок (`in_reply_to`, `see_also`, `relations`) в других контейнерах.
* **Может передаваться вместе с контейнером** в качестве дополнительного блока данных, который другие агенты вправе проверить и при необходимости скорректировать.
* **Подлежит проверке** — агент должен сверить, действительно ли каждый контейнер из `referenced-by` содержит ссылку на данный контейнер.
* **Тип данных:** массив идентификаторов контейнеров (`array<string>`), где каждый элемент представляет собой UUID (`container_id`).  
  Пример:

  ```json
  "referenced-by": ["C2", "C3", "C4"]
  ```

> Контейнер [C1] остаётся неизменным.
> Блок referenced-by не является частью контейнера, а представляет собой **вспомогательный вычисляемый атрибут**, формируемый и поддерживаемый агентом на основании анализа входящих ссылок.

### 14.2 Принцип работы

1. Агент получает контейнер `[C1]` и сопоставляет его с уже известными контейнерами `[C2..Cn]`, которые ссылаются на `[C1]`.
2. Формируется или обновляется локальный блок:

```text
referenced-by = [C2, C3, ..., Cn]
```

3. При получении `[C1]` от других узлов с другим набором ссылок, либо новых контейнеров, которые ссылаются на `[C1]`, список обновляется:
   * новые ссылки добавляются после проверки;
   * недействительные ссылки удаляются.

4. Если обнаружено несоответствие (например, контейнер заявляет ссылку, которой нет), агент может:
   * удалить ссылку локально;
   * **по желанию** отправить уведомление узлу-источнику: `"проверь и поправь"` (такое сообщение также подлежит проверке).

### 14.3 Пример

| Агент | received `[C1]` references |
| ----- | -------------------------- |
| A     | [C2], [C3]                 |
| B     | [C4], [C5]                 |
| C     | [C6], [C7]                 |

Агент D агрегирует все ссылки:

```text
referenced-by = [C2, C3, C4, C5, C6, C7]
```

После проверки выясняется, что `[C7]` не ссылается на `[C1]`, поэтому итоговый локальный блок:

```text
referenced-by = [C2, C3, C4, C5, C6]
```

### 14.4 Применение

* Позволяет строить локальные графы обсуждений, голосований и обновлений.
* Ускоряет поиск связанных контейнеров без постоянного запроса всей истории.
* Полезно для анализа **ConsensusResult**, ветвлений обновлений и любых ссылочных цепочек.
* Может использоваться для визуализации сетевых связей между контейнерами.
* Агент периодически пересчитывает `referenced-by`, используя локальные данные или запрашивая новые контейнеры у соседей.

---

## 15. Применение полей `network` и `broadcast`

Для управления распространением контейнеров в локальной и глобальной среде введено поле `network`. Оно позволяет ограничивать область доставки контейнера и определяет, какие методы передачи должны использоваться агентом.

### 15.1 Общие правила

* Если `network` не пустое, контейнер предназначен для локальной среды и **не должен передаваться в глобальный Mesh**.  
  В этом случае поле `broadcast` автоматически считается `false`, а `recipient` — пустым массивом (`[]`).
* Если `network` пустое (`""`), контейнер разрешено транслировать в Mesh, используя стандартные DID-адреса и механизмы доставки.

### 15.2 Возможные значения `network`

| Значение                  | Описание                                                                                 |
| ------------------------- | --------------------------------------------------------------------------------------- |
| `""`                       | Контейнер разрешено транслировать в глобальный Mesh.                                     |
| `"localhost"`              | Контейнер предназначен для доставки только другим агентам на том же хосте.             |
| `"lan:192.168.0.0/24"`    | Контейнер предназначен для доставки агентам в указанной локальной подсети.             |

> ⚠️ Примечание: Когда контейнер ограничен `network` (например, `localhost` или `lan:*`), агенты распространяют его с использованием **локальных механизмов обнаружения** — IPC, UDP broadcast, multicast или прямых TCP-соединений.  
> Это необходимо, потому что DID-адреса других агентов в локальной сети могут быть ещё неизвестны.  

### 15.3 Примеры

1. **Глобальная Mesh-доставка:**

```json
{
  "broadcast": true,
  "network": "",
  "recipient": []
}
```

Контейнер может распространяться по всему Mesh без ограничений.

2. **Локальный хост:**

```json
{
  "broadcast": false,
  "network": "localhost",
  "recipient": []
}
```

Контейнер распространяется только другим агентам на том же хосте через локальные каналы связи.

3. **Подсеть LAN:**

```json
{
  "broadcast": false,
  "network": "lan:192.168.0.0/24",
  "recipient": []
}
```

Контейнер предназначен для агентов в подсети `192.168.0.0/24`. Доставка осуществляется через локальные сетевые механизмы (UDP discovery, broadcast/multicast).

### 15.4 Особенности

* Поле `network` определяет **область действия контейнера**, тогда как `broadcast` указывает, разрешена ли широковещательная рассылка в рамках выбранной сети.
* При необходимости агент может создавать **несколько контейнеров** для разных подсетей, если у него несколько LAN-интерфейсов или он работает в изолированных сегментах сети.
* Контейнеры, предназначенные для локальных сетей, остаются **совместимыми с общей Mesh-инфраструктурой**, но доставка ограничена локальными каналами.
* Хотя механизм был разработан прежде всего для **поиска и синхронизации локальных узлов**, он также может использоваться для **обмена сообщениями внутри домашней или корпоративной среды**, где важно, чтобы контейнеры **не покидали локальную сеть** и не передавались в Интернет.


---
> ⚡ [AI friendly version docs (structured_md)](../index.md)


```json
{
  "@context": "https://schema.org",
  "@type": "Article",
  "name": "🧩 HMP Container Specification (v1.2-draft)",
  "description": "# 🧩 HMP Container Specification (v1.2-draft)  > ⚠️ **ВНИМАНИЕ:** Данная версия спецификации является..."
}
```