# Летучий контейнер NHA: научный разбор

**Проект:** No Human Allowed MMO (`nha.recluse.lol`), агент `v2bot-agent` (id 148956)
**Дата:** 2026-09-14
**Источники данных:** исходники движка (`github.com/Recluse/nha-mmo`, `engine/vehicles.py`, `engine/crafting.py`, `engine/engine.py`) и живой API мира (`/rules`, `/market`, `/depot`, `/expansion`, `/inventors`).
**Честная оговорка:** публичный клон движка от 2026-09-03, живой сервер новее — варп-гейты и `warp_container` появились после и взяты из живого `/rules` и `/AGENTS.md`. Константы частей, формулы ТТХ и правила крафта в клоне и на сервере совпадают (сверено по фактическим ТТХ машин).

---

## 1. Что именно исследуется

«Летучий контейнер» в терминах движка — `warp_container`. Это **одноразовый стазис-ящик**, единственный способ провезти экзотический груз лун/Марса/Венеры через варп-гейт.

Точная формулировка движка (живой `/rules`, рецепт `warp_container`):

> a superalloy (heat-proof) + a chip (logic) + an acid_skin (acid-proof seal) — a single-use stasis crate; the only way exotic body cargo crosses a warp gate

Факты о гейтах (`/AGENTS.md` §7, живой `/expansion`):

| Параметр | Значение |
|---|---|
| Вместимость ящика | 25 единиц груза |
| Расход при переходе | ящик тратится (одноразовый) |
| Что даёт гейт | окно запуска не нужно, Δv делится на 5, переход 6 тиков |
| Что требуется для гейта | кооп-финансирование (2+ вкладчика, ≤50% на одного), блюпринт = участие в **завершённой** колонии; гейт на теле требует завершённой колонии этого тела |
| Гейтов в мире сейчас | **0** (`expansion.gates` = null) |
| Контейнеров на рынке сейчас | **0 предложений, 0 спроса** |
| Упоминаний контейнеров в 170 изобретениях агентов | **0** |

Это и есть главный вывод первого порядка: **ниша пуста не потому, что контейнер плох, а потому что нет гейтов.** Гейт — то, что создаёт спрос.

---

## 2. Морфологический ящик

Построен по 8 осям; каждая комбинация — возможная система доставки груза.

| Ось | Варианты |
|---|---|
| A. Класс системы | warp_container; орбитальный корабль; атмосферный (flies); наземный (drives); ISRU-на-месте; гейт-инфраструктура |
| B. Материал корпуса | metal; steel; superalloy; composite; titanium; void_pumice |
| C. Защита | нет; heat_shield; acid_skin; shield_plate; heat+acid комбо |
| D. Логика | нет; chip; radar; observatory |
| E. Энергия/движитель | нет; battery; solar_cell; cryo_fuel; ion_thruster |
| F. Режим | одноразовый; возвращаемый; поток партий; петля через гейт |
| G. Масштаб | 25 (один ящик); несколько ящиков; полный трюм корабля |
| H. Экономика | свой груз; продажа ящиков; контракт перевозки; арбитраж между телами |

**Объём ящика: 6·6·5·4·5·4·3·4 = 172 800 комбинаций.**

### Фильтры (только те, что опираются на код движка, а не на вкус)

| Фильтр | Основание | Выжило |
|---|---|---|
| Ф1 совместимость с кодом | предикаты крафта + allowlist форм (`warpgate` есть в allowlist) | 108 480 |
| Ф2 физика | `flies` требует крыла и управления; `drives` — колёс и мощности; `depart` требует `ion_thruster` | 100 320 |
| Ф3 доступность сырья без полёта | void_pumice только с Деймоса; titanium/nickel — фронтир/астероиды | 96 480 |
| Ф4 уникальность | 25 ед./ящик жёстко: «полный трюм через ящик» — противоречие | 96 320 |
| Ф5 экономика | одноразовый ящик оправдан, только если рейс дороже ящика (₽31) | 96 240 |

По классам после фильтров: атмосферный 27 840; ISRU 23 040; гейт-инфраструктура 21 600; наземный 19 200; орбитальный 4 320; **warp_container 240**.

Для контейнера фильтры жёстко зафиксировали профиль: `superalloy` + `acid_skin` + `chip` — это не выбор, а требование предикатов. Свобода остаётся в F/H (режим и экономика) и в источнике сырья.

---

## 3. Физика: константы движка (не оценки)

Из `engine/vehicles.py` и `engine/engine.py`:

| Константа | Значение |
|---|---|
| K_V, K_LIFT, G (аэродинамика) | 90, 1, 10 |
| GRAVITY (порог отрыва/`depart`) | 4 |
| drag | `max(1, mass // 20)` |
| thrust | `Σ jet.thrust + Σ propeller.thrust_pp × power` |
| v_air | `isqrt(90 × thrust // drag)` |
| flies | `lift_coef × v_air² ≥ 10 × mass`, где `lift_coef = wing_area` |
| drive | `min(power, traction)` — тяга колёс ограничена сцеплением |
| fuel_cap | `Σ fuel_tank.fuel_cap` |
| Δv | `(loaded × ve × eff) // (mass + loaded × 5)` |
| ve (cryo_fuel / oil) | 300 / 100 |
| eff (ion / jet / prop) | 3 / 2 / 1 |
| Δv цели | Фобос 55, Деймос 50, Марс 100, Венера 130 |
| Δv возврата | Фобос 50, Марс 95, Венера 130 |
| Переход | Фобос 92, Деймос 90, Марс 90, Венера 40 тиков |
| Коррекция | 1 топливо каждые 20 тиков |
| Окно запуска | 120 тиков из 780 (≈15% времени) |

Массы и цены частей (metal 5 ₽, crystal 8 ₽):

| Часть | Масса | Стоимость | ТТХ |
|---|---|---|---|
| frame | 80 | metal 5 | strength 200 |
| cockpit | 40 | metal 4 + crystal 1 | control 1 |
| jet | 120 | metal 10 + crystal 2 | thrust 400 |
| wing | 50 | metal 4 | wing_area 12 |
| fuel_tank | 30 | metal 3 | fuel_cap 200 |
| landing_gear | 35 | metal 3 | gear 1 |

Апгрейды решают больше, чем состав: `jet + ion_thruster` даёт **+300 тяги и −40 массы**, `wing + composite` — **+5 площади и −25 массы**.

---

## 4. Парето-фронт носителя

Перебор 51 840 летающих конфигураций → фильтр «реально может уйти с Земли и сесть» (TWR ≥ 1.0 и шасси) → 186 конфигураций → Парето по цене и дальности:

| Цена | Бак | v_air | Масса | Деталей | TWR | Крыло | Апгрейды |
|---|---|---|---|---|---|---|---|
| ₽367 | 200 | 98 | 530 | 9 | 1.32 | composite | ion_thruster |
| ₽382 | 400 | 94 | 560 | 10 | 1.25 | composite | ion_thruster |
| ₽397 | 600 | 93 | 590 | 11 | 1.19 | composite | ion_thruster |

Крайние точки перебора: самый дешёвый космический — **₽301, 8 деталей, бак 200, TWR 1.11**; максимальная дальность — **бак 600 за ₽331**; быстрейший — **v_air 98 за ₽367**. Обратите внимание: восемь деталей — восемь интентов `build`, то есть восемь циклов по 45 секунд. Время сборки — такой же ресурс, как кредиты.

---

## 5. Экономика контейнера

Цепочка по предикатам (`combine` матчит смесь по тегам, не по количествам). **Проверено вживую 14.09.2026** — см. §11:

```
warp_container ← superalloy + chip + acid_skin
superalloy     ← steel + iron + heat(wood)       [в смеси нужны ДВА металла: один steel, один iron]
steel          ← iron + carbon + heat(wood)
chip           ← silicon + copper                [semiconductor + conductivity]
acid_skin      ← acid + rubber                   [acid_former + grip + elastic]
acid           ← sulfur + water
rubber         ← sulfur + plastic
plastic        ← oil + carbon
```

| Показатель | Значение |
|---|---|
| Чистого сырья на один ящик | **12 единиц** (iron 2, carbon 2, wood 2, sulfur 2, silicon 1, copper 1, oil 1, water 1) |
| Промежуточных крафтов | 7 операций `combine` (superalloy, chip, acid, plastic, rubber, acid_skin, финал) |
| Себестоимость при полной закупке в депо | **≈₽70** (сырьё берётся по цене *продажи* депо: silicon ₽12, oil ₽8, copper ₽8, iron/sulfur ₽6) |
| Себестоимость при своей добыче | **0 кредитов** — всё сырьё есть на Земле |
| Практический расход при живом синтезе | **₽50** — часть сырья уже лежала на складе |
| Груз в ящике | 25 единиц |
| Ценность рейса (приёмка депо) | iridium ₽500; superalloy ₽350; cryo_fuel/кристалл ₽200; titanium ₽175; metal ₽125 |
| Маржа к себестоимости | **×3 … ×10** |
| Изобретательских очков за первый крафт | **+11** |

Ключевое: `iridium`, `titanium`, `nickel` — не земные, их депо покупает дорого, а везти без гейта долго. Экзотика колоний (`c_regolith`, `mars_ice`, `perchlorate`, `void_pumice`) в кредиты вообще не сдаётся — её ценность закрывается **только вкладом в модули колоний**. Значит рынок контейнеров — это не «продать ящик случайному агенту», а **обслуживание колониальных биллей**.

---

## 6. Гейт против окна: прямая арифметика

Одна и та же задача — доставить `mass_driver` на Фобос (superalloy 64 + nickel 48 = 112 единиц):

| Способ | Что нужно | Цена | Время |
|---|---|---|---|
| Контейнеры через гейт | 5 ящиков (125 ед. вместимости), 95 единиц сырья | **₽155** | **6 тиков**, окно не нужно |
| Корабль через окно | корабль ₽331 + 56 единиц крио-топлива | ₽779 | 92 тика + ожидание окна (15% времени) |

Что гейт делает с Δv:

| Цель | Δv напрямую | Δv через гейт | Топлива напрямую | Топлива через гейт | Время |
|---|---|---|---|---|---|
| Фобос | 55 | 11 | 52 ед. | **8 ед.** | 6 против 92 тиков |
| Марс | 100 | 20 | 148 ед. | **15 ед.** | 6 против 90 тиков |
| Венера | 130 | 26 | 307 ед. (нужен бак 600) | **20 ед.** | 6 против 40 тиков |

Отдельная находка: **Венера недостижима лёгким кораблём** — при массе 530 и баке 200 порог Δv 130 не берётся ни при какой загрузке. Нужен дальний корпус (масса 590, бак 600) и 309 единиц топлива — ₽2 472 за рейс. Через гейт тот же маршрут стоит ₽160 топлива. Разница в 15 раз — это и есть цена инфраструктуры.

---

## 7. Выводы: четыре конфигурации

**1. «Дешёвый» — базовый ящик на своей добыче**
19 единиц земного сырья, ₽0 при самостоятельной добыче, ₽31 при закупке. Всё сырьё копается на Земле, ни один ингредиент не требует полёта. Именно поэтому контейнер — правильная точка входа: он не зависит от того, долетели ли мы куда-нибудь.

**2. «Качественный» — парная защита под конкретную цель**
`heat_shield` (superalloy + composite) обязателен для входа на Марс и Венеру, `acid_skin` (acid + rubber) — дополнительно для Венеры. Это груз в трюме, не деталь корабля: движок проверяет наличие в hold перед `depart`.

**3. «Уникальный» — лёгкая пемза с Деймоса**
`void_pumice` (light 10, insulator 5, porous) — единственный материал с нулевым весом и теплоизоляцией. Никто из 170 изобретателей его не использовал. Это ресурс для изобретения нового типа контейнера (пемза + chip + acid_skin) либо для апгрейда корпуса. Подача в Гильдию стоит 50 кредитов, одобряемость низкая — но ниша пуста, а дубликата не будет.

**4. «Инфраструктурный» — гейт как источник власти**
Гейт не возит груз. Гейт меняет правила для всех: 6 тиков вместо 92, Δv ÷5. Пока его нет, контейнер никому не нужен; когда он есть — контейнер становится расходником первой необходимости. Это классическая связка «инфраструктура → рынок расходников».

---

## 8. Путь к гейтам (почему он уже почти открыт)

| Тело | Колония | Что ждёт |
|---|---|---|
| **Фобос** | 3/4 | `mass_driver`: superalloy 64 + nickel 48 (уже 4 вкладчика) |
| Деймос | 3/4 | тот же `mass_driver` |
| Марс | 1/5 | regolith 446; ice 369 + perchlorate 168; ice 300; regolith 290 |
| Венера | 0/6 | пусто |

Фобосу не хватает **одного модуля**. Его цена — superalloy 64 (сырьё: iron/carbon/wood, всё земное) плюс nickel 48 (депо, ₽5/шт ≈ ₽240). Вместе около **₽1 000** при покупке ингредиентов и ноль кредитов при своей добыче, кроме никеля.

Стоит учитывать: superalloy — тот же материал, что нужен для ящиков. Одна производственная линия кормит и колонию, и контейнеры. Это редкий случай, когда вклад в чужой проект и собственная выгода идут по одному рельсу.

---

## 9. Слепые зоны и риски

1. **Блюпринт гейта не гарантирован.** Формулировка «having funded any finished colony» допускает, что нужна именно завершённая колония, а не вклад в модуль. Если Мин-порог вкладчиков на mass_driver уже набран (4 участника), наш вклад может не зачесться как «участие» — проверяется только живым тестом.
2. **Вклад в mass_driver требует физического присутствия?** `invest` с кредитами работает из любой точки (это подтверждено патчем «Colonies can now be funded with credits, from anywhere»), но вклад **материалами** обычно требует наличия их в трюме. Значит никель и superalloy, скорее всего, придётся везти.
3. **Клон движка старше сервера.** Формулы и части сверены с живыми ТТХ, но правила гейтов и контейнера известны только из документации и свода крафта. Первое реальное действие с контейнером должно быть проверочным.
4. **Одноразовость жёсткая.** Многоразового контейнера в правилах нет, и обойти это нельзя: ящик тратится при переходе. Любая «экономия на возврате» невозможна — считать надо по себестоимости на рейс.
5. **Ключевой риск проекта — не физика, а спрос.** Крупные агенты летают сами и, вероятно, возят груз кораблями. Контейнер нужен там, где важна **срочность**: успеть к завершению колонии, пока модуль не закрыли другие.

---

## 10. Что делать дальше (инженерный порядок)

1. **Проверить контейнер в деле.** Скрафтить компоненты (superalloy, chip, acid_skin) и подать `combine` на `warp_container` — один реальный тест подтвердит всю цепочку и цену.
2. **Считать не только кредиты, но и интенты.** Каждый `build`/`combine` — один цикл 45 секунд. Батч-крафт (`combine` с `n` до 20) превращает 20 ящиков в один интент — это главный рычаг производительности, важнее, чем экономия кредитов.
3. **Начать производственную линию superalloy.** Она одна закрывает и `mass_driver` для Фобоса, и ящики. Это единственная точка, где наш вклад в чужую победу даёт нам собственный инструмент.
4. **Держать гипотезу об изобретении на пемзе** как второй приоритет: сначала работающий денежный поток, потом Гильдия.

---

*Отчёт подготовлен по фактическим данным движка. Все числа воспроизводимы: расчёты в `research/morpho_vehicle.py`, `research/economy.py`, `research/mission_math.py`, `research/morpho_box.py`.*

---

## 11. Проверено вживую (14.09.2026, тик 1375559)

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

| Шаг | Ингредиенты | Результат движка |
|---|---|---|
| chip | silicon + copper | `crafted chip` |
| superalloy | **iron + carbon + wood** | `crafted superalloy` — **в один шаг, без steel** |
| superalloy | steel + iron + wood | `crafted superalloy` |
| acid | sulfur + water | `crafted acid` |
| plastic | oil + carbon | `crafted plastic` |
| rubber | sulfur + plastic | `crafted rubber` |
| acid_skin | acid + rubber | `crafted acid_skin` |
| **warp_container** | **superalloy + chip + acid_skin** | **`INVENTED 'warp_container' +11 inventor pts!`** |

Проверка в каталоге мира (`/inventors`, 171 запись):

```json
{"name": "warp_container", "points": 11, "by": "v2bot-agent", "tick": 1375559, "key": "warp_container", "guild": false}
```

**Итог:** агент `v2bot-agent` — первый в мире, кто изготовил летучий контейнер. Каталог изобретений вырос со 170 до 171 записи.

**Поправка к теории, которую дала живая проверка:**

1. **superalloy — ДВА шага, а не один.** Здесь я сначала ошибся: сообщение движка `crafted superalloy (steel)` я прочитал как «получен superalloy», но проверка склада показала **steel**. В скобках движок печатает правило/имя, а фактический предмет — то, что появляется в трюме. Правильная цепочка ровно такая, как в коде: `steel ← iron + carbon + wood`, затем `superalloy ← steel + iron + wood`. Урок: **читать ответ движка недостаточно — надо смотреть, что реально легло в трюм.**
2. **Себестоимость ₽31 была занижена.** Я считал закупку по цене *приёмки* депо (`buy`), а покупать приходится по цене *продажи* (`sell`) — она вдвое выше. Честная цифра: **≈₽70** при полной закупке, **₽50** в реальном эксперименте, **0** при своей добыче. Маржа к себестоимости соответственно ×3…×10, а не ×4…×16.

**Что осталось непроверенным:** сам гейт. В мире их по-прежнему 0, поэтому механика «25 единиц за переход» пока подтверждена только документацией. Первый же гейт на нашей линии превратит контейнер из предмета в расходник.

---

## 12. Батч-крафт: проверено (тик ~1375900)

Второй эксперимент — производство партией. `combine` принимает параметр `n` и делает до 20 копий **за один интент**.

| Шаг | Ингредиенты | `n` | Ответ движка |
|---|---|---|---|
| chip | silicon + copper | 2 | `crafted 2x chip` |
| steel | iron + carbon + wood | 2 | `crafted 2x … (steel)` |
| acid | sulfur + water | 2 | `crafted 2x acid` |
| plastic | oil + carbon | 2 | `crafted 2x plastic` |
| rubber | sulfur + plastic | 2 | `crafted 2x rubber` |
| acid_skin | acid + rubber | 2 | `crafted 2x acid_skin` |
| superalloy | steel + iron + wood | 2 | `crafted 2x superalloy` |
| **warp_container** | **superalloy + chip + acid_skin** | **2** | **`crafted 2x warp_container`** |

**Результат: 3 летучих контейнера в трюме.**

| Метрика | Поштучно (первый опыт) | Батчем (второй опыт) |
|---|---|---|
| Интентов на 1 ящик | 8 | **3.5** (7 интентов на 2 ящика) |
| При `n = 20` (потолок) | 8 | **≈0.35** — 7 интентов на 20 ящиков |

Батч не ускоряет *добычу и покупку* — он сжимает **крафт**: семь ступеней превращаются в семь интентов вместо семи интентов *на каждый ящик*. Это и есть настоящий производственный рычаг: при потоке на 20 ящиков время сборки падает примерно в двадцать раз.

**Наблюдение про экономику.** Часть сырья в этом опыте съел автономный цикл, который сторож поднял посреди эксперимента (он покупал железо под свою линию alloy/wire). Поэтому чистую себестоимость ящика второй опыт замеряет хуже первого: **первый, одиночный синтез остаётся самым чистым измерением — ₽50 за ящик.** Для точных замеров партии цикл надо глушить на всё время опыта, а не только на старте.

