-
Nikitos создал
Первый пункт P2-хвоста из §12 и реальный дефект из §1.3: тело 8 px при 1200 px/с за шаг 1/60 проходит около 20 px и пролетает тонкую стену между подшагами. До сих пор обходом был только ручной castShape в кадре. * физика: def.isBullet в R2DBodyDesc, r2d_physics_set_bullet/is_bullet; * engine.setBullet(id, on) / engine.isBullet(id), опция `bullet: true` в createBody; * высокоуровневое API: $.world.bullet(узел, on), $.world.isBullet(узел), .bullet(on) у узла; тег <bullet> получает CCD по умолчанию; * флаг хранится на узле (bullet_on), поэтому пересозданное тело (после смены размера) сохраняет настройку. ЧЕСТНО О ПРОВЕРКЕ. Проверено: флаг доходит до Box2D (isBullet → true, включение и выключение на ходу работают, цепочка возвращает обёртку). НЕ проверено поведенчески: воспроизвести туннелирование на стенде не удалось — обе пули, с CCD и без, останавливались у стены (x ≈ 495) и на 3, и на 12, и на 60 кадрах. Поэтому в tests/agent/highlevel_ccd_test.py (10 проверок) стоит ровно то, что доказано, а необходимый следующий шаг записан в тесте, world.md и TASKS §1.3: стена 1–2 px и подшаг мельче 1/60. Попутно найдено: $('<bullet>', { bullet: false }) работал не так, как ожидается, только из-за отсутствия умолчания у тега — теперь умолчание явное и проверено; и выяснилось, что обёртка НЕ форвардит поля узла (bullet_on читается только через nodes[0]) — это документировано в core.md §5. Проверка: полный набор qjs, bsp, агентских тестов (включая новый ccd), doc_coverage и doc_claims зелёный.c683d4d2