Добавить production-каталог опасностей
This commit is contained in:
@@ -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 дней
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user