Ролльня · симуляционный референс · 26 августа 2026 · поправлено 31 августа

Кинематика скрутки

⚠ Отчёт от 01.09, дописан 02.09, сверен 03.09. Кадры и числа симуляции сняты с модели 01.09 и с тех пор не пересняты. Прежняя редакция этой пометки называла три правки (#151, #154, #156) — с тех пор диаметры двинули ещё #152 (ядро стало коробкой), #164 и особенно #166, и расхождение оказалось куда больше, чем «двинули». Поэтому здесь не слова, а числа: эталоны play/checks.js тогда и сейчас.

базадиаметрвитки
хосомаки⌀ 33,4 → 28,9 мм1,00 → 1,19 об
футомаки⌀ 48,2 → 42,9 мм1,21 → 1,24 об
урамаки⌀ 39,5 → 32,1 мм1,24 → 1,05 об
фруктовый⌀ 60,1 → 51,8 мм1,18 → 1,21 об
тюмаки⌀ — → 36,1 мм— → 1,23 об (база заведена после)

Разбор кинематики от этого не устарел: он про то, КАК складывается лист, а не про то, какого ролл размера. Устарели числа под кадрами, и теперь видно, на сколько именно — от 11 до 19 %. Актуальные числа среза всегда в docs/reports/piece-body.html: там их сверяет tools/guide-numbers-check.py, здесь — нет. ⚠ С 05.09 эта сверка не работала: play/state.js стал разбирать ?v2 через URLSearchParams, которого нет в песочнице vm, и все headless-инструменты падали на загрузке. Починено тем же днём (PR #176); пока сторож лежал, отчёты разъехались с кодом молча.

Двумерная симуляция настоящего ролла — чтобы проверить, врёт ли картинка среза в игре. Материальные точки на сетке: рис сжимается и течёт, нори гнётся и не тянется, начинки держат форму, циновка давит. Внутри — что уже посчитано, что подтвердилось и три вещи, которые симуляция опровергла.

метод MLS-MPM, плоская деформация частиц 16 000 сетка 240² прогон 20 с на CPU единица T = слой риса ≈ 5 мм

Поправка · 31 августа 2026

Крючок нори в центре, который ниже назван успехом, — дефект

Владелец увидела в прогонах хвостик нори внутри ролла, с рисом по обе стороны от него, и сказала, что так быть не должно. Проверка по одиннадцати источникам показала, что она права. Ошибка количественная: движение верное, расстояние вдвое короче.

Было на 31.08 в 12:20, когда этот абзац писался: лаборатория вела ближний край до конца начинок и не дальше 45 % листа (FOLD_CAP, продублировано в judge.py). Повара ведут его до дальней кромки риса — 88–95 % листа: 白ごはん.com 「向こうの寿司飯の端 (海苔の空白部分)まで一気に」, OSUSHI STUDIO 「一回転で巻き切ることが大切」, makesushi.com «a single seam». Перелёт источники называют ошибкой по имени; недолёт на половину листа не рассматривают вовсе.

Складывая лист посередине, симуляция хоронит кромку в центре и наматывает остаток снаружи неё. Отсюда и крючок, и 1,3–1,4 оборота вместо одного. Рис с двух сторон от нори не бывает: два рисовых конца встречаются торцами в шве (「寿司飯と寿司飯の端を合わせて」), а не обнимают кромку.

Игра расходилась сильнее симуляции. Замер на живом стенде: подворот садился на 14,3 % листа у хосомаки и 23,1 % у футомаки. Сторож практики этого не ловил, потому что мерил spreadEnd — докуда размазан рис (89 %), — принимая это за место посадки края нори. Диапазоны случайно совпали, и зелёное подтверждало ложь.

Формула была одна и та же в трёх местах: play/model/geometry.js, sim/mat-sdf/run.py, sim/judge.py — ровно тот случай, под который в проекте заведено правило «одно определение на всех». Разбор с цитатами — sim/KINEMATICS.md; задача — #113.

Починено в тот же день · вечер 31 августа

Всё, что выше сказано настоящим временем, к вечеру уже неверно — и это оставлено видимым нарочно. Абзац про «три места» написан в 12:20, а игра разошлась с ним через тридцать четыре минуты: в 12:54 подворот в geometry.js стал решаться равенством, без всякого потолка. Лабораторию свели к одному определению вечером — новый модуль sim/fold.py, и FOLD_CAP исчез и из mat-sdf, и из judge.py. Край теперь ведут туда, куда велит источник: на дальнюю кромку риса, 87 % листа.

Формула жила не в трёх файлах, а в двенадцати — восемь девять замороженных попыток в sim/ держат её до сих пор (sim/fold.py:56-58, поправлено 31.08 коммитом 959ea11), и намеренно: их метрики получены тем кодом, и правка задним числом уничтожила бы запись. Граница выписана в sim/fold.py поимённо.

Почему абзац не переписан, а перечёркнут временем: он и есть улика. Документ пережил код на тридцать четыре минуты и стоял так до вечера, пока его не поймала сверка, — а не собственная бдительность автора.

Кадры ниже остаются как они есть: это протокол прогонов, а не картинки для украшения. Меняется не то, что на них видно, а вердикт — «плотное ядро с крючком» было принято за цель, а оказалось следствием слишком короткого подворота.

Зачем это считается

Постановка

В игре срез рисуется быстрой моделью: лист режется на угловые бины и наматывается виток за витком, а четыре числа — сжимаемость риса, прижим циновки, сглаживание бугров и размер ядра — выставлены на глаз, по фотографиям.

Симуляция нужна не для игры: она слишком медленная и на телефоне не нужна. Она нужна как эталон, по которому эти четыре числа перестанут быть догадкой. Поэтому проверяется не «красиво ли», а измеримое: где окажется начинка, сколько риса останется под ней, какой формы будет бугор.

Четыре фазы, как у повара

Что именно моделируется

Первая версия просто катила циновку по столу — и лист наматывался вокруг точки, а рис сгребался в валик перед роллом. Настоящая скрутка устроена иначе, и это пришлось прописать движением: край поднимается, заводится через начинки, прижимается, и только потом ролл катится.

Кадры ниже — прогон mat-sdf от 31.08, 13:53, с раскладкой из четырёх начинок. Дата важна: кинематику переписывали в тот же день, и кадры сняты уже после правки.

Поправка 31.08: само движение источники подтвердили заново и полностью — подъём края, начинка под пальцами, одно быстрое приземление, встречная тяга. Неверно только расстояние: край заводят не за начинки, а до дальней кромки риса. На этих кадрах подворот всё ещё считается по старой формуле (#60, пункт 0), поэтому ближний край уходит внутрь глубже, чем должен, — но гармошки и вываливающихся начинок здесь уже нет.

A · подъём: Циновка лежит ПОД листом с самого начала, её ближний край со
A · подъёмЦиновка лежит ПОД листом с самого начала, её ближний край совпадает с краем нори. Она поднимается вместе с листом; постель с начинками едет на ней, оставаясь плоской. Свободного пролёта, который складывался гармошкой, здесь нет по построению.
B · смыкание: Петля закрывается над начинками, ближняя линия риса идёт к д
B · смыканиеПетля закрывается над начинками, ближняя линия риса идёт к дальней. Начинки собираются в центр в исходном порядке, рис за роллом лежит ровным пластом, а не сгребается валиком.
C · прокатка: Ролл катится ПО ЛИСТУ, а не циновка по столу. Нори — одна не
C · прокаткаРолл катится ПО ЛИСТУ, а не циновка по столу. Нори — одна непрерывная линия, перегибов кривизны вне носа сгиба нет: mat-sdf даёт 0 / 0 / 0 по трём раскладкам. Контур круглый. ⚠ Складок внутри это не отменяет: метрика считает перегибы ВНЕ носа сгиба и про них молчит — см. врезку ниже.
D · прижим: Кольцо замкнулось, циновка давит с заданной силой. Отсюда бе
D · прижимКольцо замкнулось, циновка давит с заданной силой. Отсюда берутся «плотный» и «рыхлый» ролл — то, что в игре называется почерком.

Что на этих кадрах ещё не так · 31 августа

Лучше — не значит правильно

Нори прижата к циновке. Это главное, что изменилось: на старых кадрах между зелёной линией нори и красной дугой циновки был зазор, а повар прижимает к циновке всё. Отставание листа от циновки — не косметика, а названный дефект: мерка есть (зазор нори↔циновка), на пустом листе она даёт ≤ 0,10 U, а под начинками лист отрывается. Это пункт 3 в #60.

Внутри нори всё ещё идёт складками. Причина не в кинематике: когда рис пережат ниже физического предела, ролл схлопывается, а нори почти нерастяжима — лишнюю длину ей деть некуда. Складка тут симптом раздавленного риса (#60, пункт 1).

Хвостик от ближнего края. На кадре он есть, потому что прогон сделан до вечерней правки: подворот в sim/ тогда считался по той же формуле, что стояла в игре до 31.08 — край заводили до конца начинок, а не до дальней кромки риса. Вечером 31.08 это исправлено (sim/fold.py, посадка на 87 % листа); кадр остался как протокол прогона (#60, пункт 0).

И начинки внутри лежат не так, как у повара. Ядро укладывает их сложенным пакетом — две половины сгиба друг на друге. Настоящий 芯 — это сами начинки бок о бок, в один слой. Это #98: там решается, какую модель укладки берём для маки, спирали и кадзари.

То есть все четыре дефекта, которые видно глазом, уже заведены и объяснены. Диагноз полный — не сделана работа.

Что изменилось

Было и стало — с поправкой 31.08

Три кадра одного прогона в трёх состояниях модели. Слева — самая первая версия: ролл намотан вокруг точки, ядра нет, кусок риса остался снаружи. Справа — две независимые реализации подворота: у обеих в центре появилось плотное ядро, а вокруг него спираль.

Но дефект показывают все три, просто разный. Когда этот раздел писался, правые два считались решением: получилось ядро, контур круглый, начинки внутри. 31.08 выяснилось, что «крючок нори в центре» — не признак правильной скрутки, а следствие слишком короткого подворота, и у настоящего ролла его нет. Поэтому зелёные рамки с них сняты: раздел теперь честно показывает три состояния прибора, а не путь к успеху.

И второе, что на этих кадрах видно сразу: нори идёт гармошкой. Это не третий сюрприз, а известный дефект — просто кадры здесь сняты на СТАРОЙ кинематике, где циновка была жёсткой дугой, прижимающей сверху, а край нори тянули отдельным «захватом». Между захваченным краем и лежащим на столе листом оставался свободный пролёт, и складывался именно он; у повара такого пролёта нет ни в один момент. Переделка описана ниже, в разделе про макису, и гармошку она убрала: mat-sdf даёт 0 / 0 / 0 складок на трёх раскладках. Ниже по документу кадры уже без неё.

У гармошки нашлась и вторая причина, отдельная от кинематики: когда рис пережат ниже физического предела, ролл схлопывается, а нори почти нерастяжима — лишнюю длину ей деть некуда, кроме как сложиться. То есть складка там не причина, а симптом раздавленного риса (#60, пункт 1).

Кадры оставлены как есть — это протокол прогонов, а не иллюстрации. Условие, при котором их стоит переснимать, наступило тем же вечером: подворот в sim/ починен (sim/fold.py, край идёт на дальнюю кромку риса), и новый прогон крючка уже не даст. Пересъёмка — работа отдельная и не сделана: пока её нет, читать эти кадры надо как «до правки», а не как нынешнее состояние лаборатории (#60, пункт 0).

Срез первой версии: спираль вокруг точки, без ядра
Было · намотка вокруг точкиЯдра нет, лишний виток нори внутри, 3,25 оборота, рис потерян: 71 %. Нори гармошкой — старая кинематика, циновка прижимала сверху.
Срез варианта с захватом края: плотное ядро и крючок нори
Захват края — крючок в центреНори уходит внутрь и лежит в рисе с двух сторон. Считалось решением; 31.08 признано дефектом. Контур при этом действительно круглый — это единственное, что здесь стало лучше.
Срез варианта с ножом-лопаткой: чистый рис
Лопатка вместо пальцев — тот же крючокРис чище (частицы не захватываются), форма чуть более яйцом. Но подворот тот же и крючок тот же: замена инструмента дефекта не убирает, потому что дело не в инструменте, а в расстоянии.

Четыре начинки: попадают ли они в ядро

Главная проверка — раскладка, где у ближнего края лежат огурец, тамаго, лосось и авокадо. Все четыре обязаны оказаться внутри, компактно и в исходном порядке. Эту проверку прогоны проходят, и она остаётся в силе: начинки действительно попадают в центр и сохраняют порядок. Дефект — не в том, где начинки, а в том, что вокруг них лежит лишний виток нори.

Срез: четыре начинки в ядре, вариант с захватом
Захват краяВсе четыре в ядре, порядок вокруг центра сохранён (циклический сдвиг). Радиусы 0,7…2,8 T при радиусе ролла 4,0.
Срез: четыре начинки в ядре, вариант с лопаткой
ЛопаткаТоже все четыре внутри, рис вокруг, снаружи один виток нори. Ядро ⌀ ≈ 5,8 T. «Внутри крючка» здесь было сказано как о норме — крючка быть не должно.
Ролл целиком с циновкой после прижима
Ролл целикомТот же прогон в момент прижима: красным — дуга циновки, под ней ролл.

Числа

Три раскладки, две реализации

Раскладки: пустой лист (базовая геометрия), тамаго у края (одна толстая начинка), четыре у края (ядро из четырёх). Прогон каждой — около двадцати секунд.

МетрикаПустойТамагоЧетыреПустойТамагоЧетыре
реализациязахват краялопатка
Радиус ролла, T (медиана)3,403,644,003,443,573,89
Оборотов нори (измерено)2,942,531,972,642,692,39
Оборотов по формуле площади3,322,392,03———
Сжатие риса (J, 1 = не сжат)0,9240,9210,9250,9570,9010,931
Риса на карте среза81 %80 %74 %79 %76 %75 %
Нори целадададададада
Частиц вылетело000000
Секунд на прогон19,921,321,421,925,321,2
Обе реализации устойчивы, нори нигде не рвётся, ничего не вылетает за пределы расчёта. Расхождение между реализациями — в пределах разброса самого метода (±0,1 оборота между двумя запусками одного и того же).

Что симуляция опровергла

Ради этого всё и считалось

Три ожидания оказались неверными — причём два из них были моими, а не ошибкой расчёта. Это и есть главная польза эталона: он ловит то, что «на глаз» выглядит правдоподобно.

Опровергнуто · оба агента независимо

Число оборотов — это арифметика, а не мастерство скрутки

Целью стояло «один оборот нори». Оказалось, при длине листа 38,7 T это недостижимо никакой кинематикой: площадь материала задаёт радиус, радиус — число слоёв.

Rout = √(площадь / π) · слоёв = (Rout − R ядра) / (T + w)

Предсказание формулы: 3,32 / 2,39 / 2,03. Измерено: 2,94 / 2,53 / 1,97. Совпадает. Значит один оборот получается не «правильной скруткой», а правильной длиной листа — потому повар и берёт полулист на тонкий ролл, а лишнее отрезает.

Опровергнуто · рис

Рис не теряется — он сжимается

Площадь риса на карте среза 74–81 %, и это выглядело как потеря. На деле рис уплотняется: J ≈ 0,92…0,96, то есть на 4–8 %. Остальное съедает отрисовка: лента нори рисуется поверх риса и забирает 1,5–2 T² площади.

Вывод для эталона: сохранение надо мерить по массе, а не по пикселям. Настоящая потеря была раньше и по другой причине — циновка сгребала рис в валик перед роллом; починилось тем, что ролл катится по листу.

Опровергнуто · единицы

«Диаметр 4,5–5» — это сантиметры, а не толщины риса

Ориентир из документа был прочитан как «4,5–5 T», и агенты честно показали, что это невозможно: одного риса в срезе 33,7 T², а круг такой площади уже имеет диаметр 6,5 T. При слое риса 5 мм измеренный ролл — 4,0 см по медиане и 4,75 см по максимуму, то есть настоящий футомаки.

Моя ошибка · поймана арифметикой

Рулету дали лист вдвое длиннее

В задании на спиральные базы стояла длина листа 75; правильная — 40,2. Агенты честно намотали 7,7–8,3 оборота — верная физика для неверного листа. Длины тогда были выведены из самого стенда: суши 38,7, рулет 56,9, лаваш 48,4 (рулет и лаваш сняты 31.08 — тематика японская). Поправка 26.08: числа «рулет 40,2» и «лаваш 107,6» здесь стояли неверно — у лаваша в спеке была вдвое завышена толщина листа, и ошибка ушла в длину. Ниже — почему длина листа вообще не должна выводиться.

Моя ошибка · формулировка

Стык в стык — это реальность, а не стилизация

Я записал в доки, что смыкание листа встык — упрощение ради читаемости. Неверно: лист 19 см при ролле ⌀ 5–6 см (обхват ≈ 17 см) делает один оборот, а голая полоса ложится снаружи, поверх нори — на срезе её не видно. Тёмная дуга внутри появляется только когда лист длиннее обхвата, то есть при неверном размере листа.

Рука меняет ролл

Проверка «почерка» для игры

Отдельно проверялось то, ради чего в игре появился почерк: даёт ли скорость тяги и сила прижима читаемую разницу, а не шум. Даёт — и в ожидаемую сторону.

ПрогонРадиусОборотовРисаСжатие JЧитается как
медленно 0,63,732,5882 %0,902плотнее, туже
обычно 1,03,952,4784 %0,929эталон
быстро 1,64,082,1984 %0,941рыхлее, воздух между витками
прижим слабый 0,53,832,1786 %0,946крупнее, мягче
прижим сильный 2,03,633,0874 %0,823мельче, плотнее, витков больше
Быстрее — рыхлее и крупнее; сильнее прижим — мельче и плотнее. Глубина подворота двигает начинку из самого центра наружу: при 0,6 тамаго на радиусе 0,15 T, при 1,3 — на 1,50 T; на крайнем значении нори уже рвётся.

Это ровно тот эффект, который в игре теперь берётся с жеста: как тянешь циновку и держишь ли в конце. Разброс идёт от руки, а не от процессора — то есть это почерк, а не лотерея.

Циновка: две модели

Переписывание кинематики под настоящий макису

После главной поправки — циновка лежит под листом и катится вместе с роллом — её переписали двумя способами. mat-sdf задаёт циновку аналитически: дуга окружности, касающаяся стола, как знаковое расстояние. mat-chain — лагранжева цепочка узлов с ограничением на минимальный радиус изгиба и сервоприводом давления: радиус ролла должен получаться из контакта, а не задаваться.

Карта среза: mat-sdf

mat-sdf — начинки держат форму, контур круглый, нори тонкой непрерывной спиралью.

Карта среза: mat-chain

mat-chain — нори тоже одной спиралью, но огурец и авокадо размазаны в ядро, контур гуляет.

Три раскладкиmat-sdfmat-chain
Сохранение массы0,954 / 0,965 / 0,9710,958 / 0,967 / 0,964
Радиус (медиана) против формулы−1…+1 %+1 %
Радиус (максимум) против медианы+2…+4 %+16…+48 %
Складок по порогу циновки0 / 0 / 00 / 1 / 1
Начинка вне контура0 / 0 / 00 / 6,7 % / 2,7 %
Сбежавших частиц00
По сохранению массы модели неразличимы. Но две строки про радиус надо читать вместе: у mat-chain ролл круглый в среднем и на 30–48 % шире по максимуму — потому что хвост листа не завёрнут, он лежит плоско на столе, а ядро остаётся полым. Медиана этот дефект прячет целиком.

Моя ошибка · тройная

Я объявил mat-chain провалившимся. Это неверно

Цифры были из промежуточного прогона — я прочитал метрики, пока агент ещё работал, и процитировал «нори на 16 кусков, 1002 частицы вне контура». Итоговые числа в таблице выше.

Перепутал цвета на картинке. Зелёного в срезе три: нори тёмная, огурец яркий, авокадо светлый. Разбросанные зелёные пятна, принятые мной за обрывки нори, — это огурец и авокадо.

Механизм выдумал. Написал «защемляет на стыке жёстких планок». В mat-chain нет планок со стыками — это цепочка узлов с минимальным радиусом изгиба. Объяснение описывало модель, которой не существует.

Моя ошибка · не та статистика

Я взял медиану — она и прячет дефект

Отменяя приговор, я сослался на то, что радиус mat-chain ложится в формулу площади на 1 %. Это медианный радиус, и он правда ложится. Максимальный — на 16–48 % больше, и на кадре видно почему: скрутка не доведена, конец листа так и остался лежать на столе.

Вывод для метрик: «ролл это или клякса» решает максимум, а не медиана. В отчёт по любой модели надо брать оба числа — по отдельности каждое врёт.

Проверено · гипотеза отброшена

Разные умолчания у паузы — не причина

У ключа --hold (пауза в конце, когда рис сходится с рисом) умолчания разошлись: 1.0 в одной модели, 0.0 в другой, и обе гонялись на дефолтах. Похоже на нечестное сравнение — перепрогнал с одинаковой паузой. Сохранение чуть лучше, но складок на четвёртой раскладке стало 16 вместо 3. Дело не в ней.

Открыто

Выбор не закрыт

mat-sdf сегодня даёт картинку, которой можно пользоваться, и на неё опираются калибровочные числа. Но её циновка — прописанная дуга: радиус ролла задан, а не получен. У mat-chain постановка честнее, и она не доведена: автор сам пишет, что свободная цепочка либо схлопывается, либо уезжает плоской лентой, поэтому мишень по длине дуги пришлось задать, оставив свободным только радиус.

Правильный следующий шаг — не выбрасывать mat-chain, а доделать в нём эмерджентный радиус.

Толщины оказались корнем

Просьба владельца, которая развернула всю картину

Владелец попросила проверить толщину нори, сладкого теста и лаваша. Проверка вскрыла не мелочь: симуляция не могла поймать эту ошибку — в неё зашита та же толщина нори, что и в стенд. Эталон унаследовал допущение и потому подтверждал сам себя.

ЧтоБылоСталоОткуда
Нори0,6 мм0,10 ммFAO: лист 21×19 см, ~3,0 г → 75 г/м². расчёт
Рис для маки5 мм7 ммSUZUMO SVS-FCA: 7 / 8 / 12 мм. замер
Лаваш1,0 мм2,0 мм15 коммерческих тортилий 1,3–1,7 мм; 10.3390/foods10071473 — 2,0–2,5. замер
Бисквит8,5 ммверноBakels: тесто 6–7 мм, пласт 8–10 мм
Крем5 ммвернорасчёт из рецептов с массами: 3–8 мм
Начинка в лаваше2,25 ммвернорасчёт из рецептов: 2–4 мм
Каждый DOI резолвился через doi.org; пиратские зеркала не открывались. Прямого замера толщины нори в открытом доступе нет — 0,10 мм получены из массы на площадь. ⚠ Лаваш, бисквит, крем и начинка в лаваше — базы, снятые 31.08 (тематика японская): строки остались протоколом проверки, действующих баз они не описывают.

Сошлось без подгонки

Длина листа — это продукт, а не свободный параметр

В стенде длина листа выводилась из угаданного числа витков. Значит ошибка в толщине листа молча уезжала в длину — и именно так лаваш получил лист вдвое длиннее настоящего. Порядок развёрнут: лист нори закреплён как физический продукт 21×19 см, число витков выводится из него.

Результат сошёлся с натурой сам: пустой ролл ⌀ 2,9 см — настоящий хосомаки 2,5–3; с четырьмя начинками ⌀ 4,3 см — футомаки 4–5.

Открыто · решать владельцу

Строгий один оборот — упрощение

Раскладка «реалистичный футомаки» (30 % начинки, рис кругом) прошла чисто: нори цела, складок нет, ⌀ 4,1 см. И дала 1,85–1,91 оборота, а стенд рисует один: целый лист вокруг ролла обхватом 12,9 см физически даёт полтора-два.

Для хосомаки на полулисте один оборот верен — там почти встык. Для футомаки на целом листе есть честный нахлёст. Напрашивается развести их как две базы с разной длиной листа вместо одной «суши» с обрезкой.

Моя ошибка · гипотеза не подтвердилась

«Листа не хватает» — проверил, неверно

Перегруженная раскладка рвала нори, и я решил, что мало листа. Прогнал на листе в 1,5 раза длиннее — стало хуже: 18 кусков вместо 6. Настоящая причина другая: начинки занимали 64 % сечения, нори ложилась не на рис, а прямо на жёсткие бугры. У настоящего футомаки начинки 30–40 %.

Срез реалистичного футомаки
проверочныйРеалистичный футомаки: 30 % начинки, рис кругом, ⌀ 4,1 см. Прогон чистый — на нём и видны два кольца нори вместо одного.

Как ролл сворачивается: кольцо, а не спираль

переписано 01.09.2026 · issue #132

До 01.09 модель наматывала лист архимедовой спиралью: позиция на листе росла вместе и с углом, и с радиусом, слой ложился на слой. Проверка одной строкой показала, что такой ролл невозможен:

базаобхватлист норинахлёст
футомаки212,7 мм210 мм−2,7
хосомаки108,1 мм105 мм−3,1

Отрицательного нахлёста не бывает: лист короче того, что должен обернуть. Это не расхождение с источником, а тождество про длину — оно не зависит ни от плотности риса, ни от способа укладки, ни от того, чей корпус мы взяли за эталон. Проверено и по граммам: tools/variants.js даёт отрицательный нахлёст при 80, 100, 200 и 250 граммах.

У повара рис образует одно кольцо. Два конца постели встречаются торцами (「寿司飯と寿司飯の端を合わせて」), а нори обходит готовое кольцо снаружи один раз плюс нахлёст. Отсюда и разрешается давняя путаница: «один оборот» источников — это про НОРИ, а не про рис.

В модели это значит, что угол растёт по листу, а радиус говорит только, в какой ты зоне — ядро, рис, нори. Внешний радиус берётся из сохранения площади, и тождество сходится точно: интеграл (r²−r₀²)/2 по углу равен площади риса на постели.

Что стало: нахлёст положительный у всех баз, хосомаки ⌀28,9 при замере владельца рулеткой 25–30, сторож практики даёт 32 сошедшихся утверждения и ни одного провала. Те три расхождения, что стояли здесь (некруглость #19, доля начинки #16, центрированность #129), закрыты 01.09. На их место встали другие, и они не про форму, а про сохранение материала: концы рисовой постели не встречаются торцами, потому что рису нужно 1,3–1,6 витка, а кольцо кладёт один (#165), и площадь куска гуляет в 1,14 раза от положения на листе (#134).

Спираль вернулась — вторым режимом, а не вместо кольца

Дописано 02.09.2026 · issues #142, #141, #153, #154

Раздел выше доказывал, что маки — это кольцо, и доказательство стоит: лист короче того, что должен обернуть, если наматывать спиралью. Вывод верен, а вот числа под ним устарели, и это надо знать, читая их.

базаобхватлистнахлёст 01.09нахлёст сейчас
футомакиобхват 153,9 мм · лист 210 ммнахлёст 01.09: −2,7сейчас: +56,1
хосомакиобхват 95,3 мм (пустой) / 97,6 (с огурцом) · лист 105 ммнахлёст 01.09: −3,1сейчас: +9,7 / +7,4

Отрицательный нахлёст был свойством той модели, а не блюда. За 02.09 его убрали три правки, каждая со своим замером: ролл перестал быть на 28 % больше своего материала (#151 — ядро дорисовывало рис, которого на листе нет), трубка сердечника заполнилась рисом (#154 — дыра занимала 16 % площади и была невидима, потому что красилась рисом), и долг ядра стал сниматься вместе с ядром (#156 — иначе ролл выходил на 42 % МЕНЬШЕ листа).

А спираль оказалась не невозможной, а другим блюдом. Возражение владельца было точным — «нори же не растянуть», — и ответ в том, что растягивать не надо: ролл становится меньше. При той же площади риса у спирали нет дырки в середине, поэтому обхвата нужно меньше. Замер: кольцо с ядром 0,6R даёт ⌀ 59,2 мм и обхват 186; спираль — ⌀ 47,4 и обхват 149 при 2,8 витка.

Поэтому в каталоге появилась вторая база — узумаки 渦巻き寿司: витков 1,96, ⌀ 55,2 мм → витков 5,88, ⌀ 39,8 мм → витков 5,93, ⌀ 39,3 мм (пересняты 02.09 коммитом 87c4057, сверено 05.09: play/checks.js:131), ядра нет вовсе, носитель — омлет, а не нори.

Почему числа пересмотрены. База называлась спиралью и спирали не делала. Владелец разложила начинку по всему листу и сказала: «совсем не похожа на архимедову спираль». Она была права — полтора-два витка это кольцо с нахлёстом, и спиралью оно не станет ни при какой отрисовке. Витков ≈ √(L / 4π·T), и замер показал, что одним листом спирали не выходит вовсе: даже при рисе 1,25 мм потолок 3,2 витка, а тоньше рис — уже не постель, а плёнка. Длинный лист витки даёт, но при толстом рисе раздувает ролл до ⌀ 66 мм, что не еда. Работает только пара «длинный лист И тонкий рис»: 42 см при 1,5 мм.

В самой записи базы это намерение стояло с самого начала — «постель тоньше, потому что на спираль рис кладут тоньше», — но взято было 1,4 против 1,57 у футомаки, то есть 7,0 мм против 7,3 7,85 (пересчёт по U_MM = 5, catalog.js:205; так и записано в новом ядре — play/core-v2/units.js:225. Ошибка продублирована в комментарии catalog.js:165). Намерение записали, в число не положили. Диаметр при пересмотре упал, и это правильная сторона: тонкая постель уносит меньше площади. ⚑ Два листа встык — приём настоящий (飾り巻き寿司 доматывают вторым листом), но именно для 渦巻き寿司 источником не подтверждён; сходимость по объёму проверена: 42 × 19 см при 1,5 мм ≈ 120 см³ риса против 200 г на футомаки у 白ごはん.com.

Правило «нори не крутят спиралью» осталось решением о содержании игры, а не свойством геометрии: модель обязана уметь свернуть что угодно, ограничивать будет тот слой, который раздаёт базы.

И кольцо теперь само переходит в спираль, когда рису нечем обойти начинки (#141). Порог выведен, а не выбран — периметр коробки ядра против длины намазки, — и обе его границы замерены: эхомаки при 1,01 обязан остаться кольцом (это настоящее блюдо, семь начинок по числу богов удачи), семь полос по всему листу при 1,15 кольцом быть не могут.

⚠ Величина заменена (#152). Та мерка перестала отвечать на свой вопрос: скрутка стала собирать начинки в пучок, и замер дал семь полос по всему листу с отношением 0,45 — меньше канона 0,50, то есть порог сработал бы наоборот. Действующий критерий — охват начинок вдоль листа против длины намазки, play/model/geometry.js:2406-2422, срабатывание при охвате > 0,6.

⚠ Что в этом разделе всё ещё не доведено: лента носителя прыгает на 3 мм за один бин (#153 — дуга бина 0,1 мм, любая вертикальная стена профиля становится радиальным обрывом; за 02.09 скачок ушёл с 5,67 до 3,47, а после правок 03.09 — до 1,50 мм), и у спирали остаётся расхождение площади −6,5 %. Оба числа под мерками. Но не оба под сторожем: цикл проверки идёт по ['hoso','futo','ura'] (play/checks.js:669) — все три кольцевые, а узумаки, единственная спиральная база, в него не входит, поэтому расхождение площади сторож поймать не может. И номера тикетов здесь неверны: #153 и #156 — про другое, та же ошибка продублирована в коде (checks.js:690,704,711, geometry.js:2454).

Что дальше

Обновлено 02.09.2026

Что из прежнего списка закрыто: хосомаки и футомаки стали двумя базами с разной длиной листа (вместо одной «суши» с обрезкой излишка), и появились ещё две. Пункт «сравнить с фотографиями реальных срезов» закрыт не так, как задумывался: снимок анфас с приемлемым наклоном не нашёлся ни у мастеров, ни у школ, зато числа нашлись в паспортах суши-машин — и они точнее любого обмера по кадру.