Добавить production-каталог опасностей

This commit is contained in:
2026-08-19 05:30:56 +03:00
parent cc7f487cf7
commit dc2ebcbf8c
33 changed files with 1160 additions and 37 deletions
+6 -4
View File
@@ -178,16 +178,18 @@ baseline-задачи также имели явного владельца по
- content не содержит blocker-softlocks и обязательных невосстановимых объектов;
- принят `goon-game-milestone-production`.
Статус на 19 августа 2026: Stage 6 начат в изолированном production stream.
Статус на 19 августа 2026: Stage 6 выполняется в изолированном production stream.
Завершены три foundation slice. `goon-game-character-states` добавил
явные Idle/Run/Turn/Jump/Fall/Land/Interact/Stunned/Death transitions.
`goon-game-corpse-manager` перенёс регистрацию, transforms, FIFO budget, reset,
save/restore и diagnostics тел в отдельного владельца без изменения физики и
геометрии. `goon-game-puzzle-events` выделил pressure/toggle/timed/relay channels,
immutable events и явные DoorController states; двери и платформы читают общую
data-driven модель. Последний gate: 89 JVM-тестов и Android 16 matrix `38/38`.
Следующая итерация — production-каталог hazards (`crusher`, `fire`, projectile,
explosion), который затем даёт источники для новых corpse states.
data-driven модель. Завершён первый mechanics slice: production-каталог hazards
(`crusher`, `fire`, `projectile`, `explosion`), обучающие уровни 11–14,
динамическая пагинация каталога и 12/12 bot-прохождений. Последний gate:
99 JVM-тестов и Android 16 matrix `43/43` (`2004.172 s`). Следующая зависимая
итерация — новые corpse states на источниках production hazards.
### Этап 7. Техническая стабилизация и release engineering — P0, 4–8 дней
+76 -1
View File
@@ -285,9 +285,84 @@ Goal расположен на верхнем уступе за PIT и закр
**Softlock/неопределённость:** исправлены два независимых blocker-состояния: saw-тело больше не соскальзывает с плиты после доставки, а перекрытие floor/lift увеличено до 140 px при сохранении 200 px `PIT` и обязательного вертикального подъёма. Период lift увеличен до `10.0 s`, чтобы нижняя фаза была читаемой при задержанном вводе. Бот теперь явно приземляется на frozen corpse и прыгает с него; доставка saw-тела, три сохранённых тела, посадка, подъём и lift→ledge прыжок подтверждены тремя запусками и стресс-сценарием. Возможная альтернативная двухсмертная трасса не считается blocker, пока intended three-body route остаётся стабильным.
## Уровень 11 — `The Brass Breather`
**Статус:** доказан production-input ботом, 3/3 изолированно и 3/3 в общей hazard-матрице.
**Ожидаемые и доказанные смерти:** `1`.
```text
CRUSHER перекрывает единственный проход
→ первый доброволец входит в активный пресс и оставляет тело
→ следующий доброволец подходит к безопасной границе
→ наблюдает закрытие и следующий переход пресса в REST
→ прыгает через сохранённое тело и проходит пресс в полном окне отдыха
→ достигает goal с одной смертью
```
**Контракт:** `cycleSeconds=4`, `activeSeconds=2.5`; collision активен только в
CRUSH-фазе. Bot snapshot наблюдает `firstHazardActive`, не использует sleeps,
restart или прямую мутацию состояния.
## Уровень 12 — `Blue Funeral`
**Статус:** доказан production-input ботом, 3/3 изолированно и 3/3 в общей hazard-матрице.
**Ожидаемые и доказанные смерти:** `1`.
```text
FIRE перекрывает floor
→ первый доброволец демонстрирует смертельность синего огня
→ после respawn игрок подходит к рассчитанной точке x≈535
→ отдельным takeoff подтверждает airborne state
→ пересекает весь flame box до приземления
→ достигает goal, тело остаётся в уровне
```
**Контракт:** постоянный `FIRE=(700,790,120,90)` с отдельными visual/audio IDs.
Маршрут запрещает вторую смерть на approach, takeoff и clear checkpoints.
## Уровень 13 — `Crossfire Clock`
**Статус:** доказан production-input ботом, 3/3 изолированно и 3/3 в общей hazard-матрице.
**Ожидаемые и доказанные смерти:** `1`.
```text
PROJECTILE каждые 3 s проходит справа налево
→ первый доброволец погибает и показывает линию снаряда
→ после respawn игрок останавливается у x≈600
→ ждёт наблюдаемое окно projectile x=850..930 и прыгает через первый проход
→ останавливается за линией и ждёт следующий цикл x=1350..1450
→ вторым прыжком проходит возвращённый снаряд
→ добегает за spawn снаряда и достигает goal без новых смертей
```
**Контракт:** runtime вычисляет текущий box из `speedX=-400` и сбрасывает его
на исходную позицию по `cycleSeconds=3`. Оба прыжка привязаны к snapshot
координате, а не к wall-clock.
## Уровень 14 — `Steam Charge`
**Статус:** доказан production-input ботом, 3/3 изолированно и 3/3 в общей hazard-матрице.
**Ожидаемые и доказанные смерти:** `1`; дверь обязана открыться.
```text
Door требует signal "blast-gate" от удалённой PRESSURE
→ первый доброволец входит в активный EXPLOSION
→ impulse (550,-500) доставляет тело на PRESSURE x=980..1160
→ тело закрепляется на плите и открывает Door
→ следующий доброволец наблюдает новый BLAST и следующую REST-фазу
→ проходит inactive explosion
→ перепрыгивает сохранённое тело на плите
→ проходит открытую Door и достигает goal
```
**Контракт:** `EXPLOSION` использует data-driven цикл `4/2 s`; inactive-фаза
отличается визуально (`REST`) и не убивает. Device RED с `impulseX=1400`
доказал перелёт тела за плиту; минимальное authored значение `550` стабильно
помещает тело в `firstCorpseX=980`, после чего `allDoorsOpen=true`.
## Проверки, следующие из графов
1. Сохранять полный integrated device-regression: intended route уровней 1–10 по три раза и отдельный recovery route уровня 8.
1. Сохранять полный integrated device-regression: intended route принятых уровней по три раза и отдельный recovery route уровня 8.
2. Отдельно проверить предполагаемый sequence break уровня 2 и необязательность `FREEZER` на уровне 10.
3. Добавить параметризованные проверки restart из ключевых промежуточных состояний.
4. Повторить bot matrix на дополнительных frame rates и поддерживаемых версиях Android.
+68
View File
@@ -0,0 +1,68 @@
# Stage 6 production hazards
Date: 19 August 2026
Beads task: `goon-game-hazards-full`
## Delivered contract
- JSON hazard definitions now support crusher, fire, projectile and explosion
types with data-bound cycle, active window, velocity, visual style and audio cue.
- `HazardRuntime` owns deterministic cycle state and moving projectile geometry.
- `GameView` collision, drawing, procedural audio and restore consume the same
runtime definition; no hazard timing is duplicated in the bot.
- Four focused teaching levels extend the catalog from 10 to 14.
- The level-select UI pages an arbitrary catalog in groups of ten and exposes all
four new levels through real touch controls and RU/EN copy.
- Tape/session validation derives the upper level bound from `LevelCatalog`
instead of a hard-coded ten-level limit.
## Teaching routes
- Level 11: sacrifice to a rhythmic crusher, then cross during a fresh REST window.
- Level 12: sacrifice to fire, then take off from the safe staging point and clear it.
- Level 13: read and evade two consecutive projectile cycles after one sacrifice.
- Level 14: explosion-deliver a body to a pressure plate, cross the next REST
window, jump the retained body and pass the opened door.
Every route uses production input and read-only snapshots. It has no restart,
retry, teleport or direct completion mutation and asserts exactly one death and
one retained body. Level 14 additionally requires the door-open event.
## TDD evidence
RED cycles covered missing schema symbols, missing runtime, each new hazard type,
the old hard-coded ten-level tape/session bound, missing level pagination and
missing intended-route scenarios. Device REDs then exposed:
- a crusher crossing begun midway through its rest interval;
- a fire jump staged too early and descending into the far edge;
- a second projectile cycle not handled by the initial route;
- an explosion impulse that overshot its required plate;
- an always-active explosion box that could not be cleared with release physics;
- the retained level-14 body correctly blocking the living player at the plate.
Each was resolved at the narrowest responsible layer: state-driven choreography,
authored explosion impulse/cycle, and an explicit jump over the retained body.
## Focused acceptance
- Validator: `14/14`, format `1`, physics `1`.
- Level 11: `3/3`, `46.414 s`.
- Level 12: `3/3`, `41.143 s`.
- Level 13: `3/3`, `44.630 s`.
- Level 14: `3/3`, `52.089 s`.
- Combined one-install matrix: four routes, twelve playthroughs plus touch
pagination, `5/5` test methods, `221.894 s`.
## Final gates
- JVM: `99`, failures `0`, errors `0`, skipped `0`.
- `lintDebug`, `assembleDebug`, `assembleDebugAndroidTest`: GREEN from clean.
- final unfiltered Android 16 matrix: `43/43`, failures `0`, `2004.172 s`, on
the exact clean-built final app/test APK.
- debug APK ZIP integrity: `unzip -t` GREEN and contains all 14 JSON levels.
- debug APK SHA-256:
`f220ada1da1e32bbca15615487f49a1ac3b61d924af292b648b6693a14d5f212`.
The dedicated AVD was stopped after the gate.
+1 -1
View File
@@ -65,7 +65,7 @@ Snapshot на 19 августа 2026 года:
| 3 | 5 | 0 |
| 4 | 4 | 0 |
| 5 | 15 | 0 |
| 6 | 18 | 18 |
| 6 | 18 | 12 |
| 7 | 9 | 9 |
| 8 | 1 | 1 |
| 9 | 1 | 1 |