Register slice 16 sight: inspect images and a denser linked catalog.
ci / server (push) Failing after 3m43s
ci / client (push) Successful in 22s

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-21 20:46:33 +03:00
co-authored by Cursor
parent bcc3f1333c
commit 02156e4491
8 changed files with 461 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
# Фаза 87. Субъект кадра
## Зависимости
- [Фаза 66](../11-events/66-scene-prompt.md)
- [Фаза 60](../off-queue/60-portrait-models.md) (пресеты и shot kind)
- [Фаза 39](../08-session/39-school-owners.md) (гость уже генерирует портрет человека)
## Зачем
Кабинет и футболка — не человек в URL портрета. Появляется HTTP субъекта «узел» и «вещь»,
PNG на диске, kind `scene`/`thing` без лифта живых пресетов.
## Задачи
- [ ] `GET`/`POST` `.../schools/{id}/nodes/{nodeId}/image` и `.../image/prompt`. Ключ узла —
id карты. PNG: `saves/{id}.images/node.{safeId}.png`
- [ ] `GET`/`POST` `.../schools/{id}/things/{defName}/image` (query `color`) и `.../image/prompt`.
PNG: `saves/{id}.images/thing.{def}.{color\|none}.png`. Нет instance id
- [ ] Сборка узла: Room/Territory prompt + fill с текстом + погода, если улица. Без внешности и
одежды человека. При ненулевой занятости узла — не больше одного общего фрагмента из
`SimulationOptions`, не имена
- [ ] Сборка вещи: `prompt` def + цвет + износ, если смотрим надетое (износ в промпте; ключ файла
без износа). Молчаливый def — не Swarm
- [ ] Пустой вклад — `400` `cannot-generate`. Нет узла/def — `404`. Swarm как портрет (`503`/`502`/`504`)
- [ ] Гость: тот же успех, что `POST .../people/.../portrait`, не `403`
- [ ] В шаблоне `swarmui.json` у пресетов shot kind `scene` и `thing`. Живая школа без них не
переписывается; fallback строки в `SimulationOptions`
- [ ] [`protocol.md`](../../protocol.md) — маршруты и коды, тем же коммитом. Сокет не бампить.
`PortraitKind` человека не расширять значением `scene`
## Тесты, без которых фаза не закрыта
- [ ] GET картинки узла до POST — `404` `image-missing` (или согласованный код в protocol.md)
- [ ] POST класса: prompt содержит место/fill, не «teenage girl» / возраст карточки
- [ ] POST узла без вклада (этаж/лестница без prompt) — `400`, Swarm не звали
- [ ] POST `Chair``400` `cannot-generate`
- [ ] POST `TShirt?color=White` — prompt английский про футболку, без субъекта-человека
- [ ] Гость POST узла — не `403` (тот же класс исхода, что портрет; хост с фикстурой Swarm или
тот же skip-контракт, что у портрета)
- [ ] Живой `portraitSettings` без kind `scene` генерирует узел через fallback и не перезаписывает
сейв пресета
- [ ] Occupancy > 0 добавляет не больше одного общего фрагмента; имён людей в prompt нет
- [ ] Сокет Version не меняется
## Критерий готовности
- curl/хостовый тест: POST кабинета → PNG на диске; GET отдаёт image/png
- «Показать промпт» узла доступен HTTP, даже если кнопки в UI ещё нет
- Отфильтрованные тесты: AppHost (маршруты), сборщик на сервере; не весь раствор
## Стоп
Не кнопки в DOM. Не автоген всем узлам. Не ControlNet. Не бамп сокета. Не групповые лица.