Добавить первую волну мира Foundations
This commit is contained in:
@@ -213,6 +213,11 @@ Android matrix `52/52` (`551.773 s`). Evidence — `STAGE6_CHALLENGES.md`.
|
||||
Каждый мир содержит 11 MAIN, один CHALLENGE и один FINALE; Gradle `preBuild`
|
||||
проверяет матрицу и соответствие авторизованного JSON-префикса. Контракт —
|
||||
`STAGE6_CONTENT_MATRIX.md`; следующий authoring wave — Foundations 19–30.
|
||||
Первый bounded wave Levels 19–22 принят: movement/jump, два тела над раздельными
|
||||
spikes, retained pressure Door и toggle ferry имеют solution graphs, collectibles,
|
||||
restart proof и 12/12 production-input playthroughs. Cold unfiltered candidate
|
||||
прошёл Android `57/57` за `1807.264 s`, app JVM `117/117`, content-tool JVM `7/7`.
|
||||
Evidence — `STAGE6_FOUNDATIONS_WAVE1.md`; следующий slice — Levels 23–26.
|
||||
|
||||
### Этап 7. Техническая стабилизация и release engineering — P0, 4–8 дней
|
||||
|
||||
|
||||
@@ -462,6 +462,79 @@ time runs. Legacy levels без collectible получают третью зве
|
||||
`bestStars=3`; новый `ProgressStore` после трёх запусков возвращает 3 звезды для
|
||||
`foundations.threefold-proof`.
|
||||
|
||||
## Уровень 19 — `First Return`
|
||||
|
||||
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
|
||||
**Ожидаемые и доказанные смерти:** `0`.
|
||||
|
||||
```text
|
||||
LevelID="foundations.first-return", WorldID="foundations"
|
||||
→ игрок подходит к нижнему уступу x=650..890 и перепрыгивает его
|
||||
→ отпускает jump, подтверждает новое касание пола и создаёт второй jump edge
|
||||
→ вторым прыжком проходит высокий уступ x=1080..1380
|
||||
→ на безопасной дальней прямой забирает collectible x=1500
|
||||
→ достигает goal x=2090..2176 без смертей
|
||||
```
|
||||
|
||||
**Контракт:** уровень повторно калибрует движение и раздельные jump edges перед
|
||||
production-комбинациями. На нём нет hazard, switch или Door; failure означает
|
||||
ошибку управления, а не скрытое состояние головоломки.
|
||||
|
||||
## Уровень 20 — `Covered Path`
|
||||
|
||||
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
|
||||
**Ожидаемые и доказанные смерти:** `2`; оба тела сохраняются.
|
||||
|
||||
```text
|
||||
LevelID="foundations.covered-path", WorldID="foundations"
|
||||
→ первый доброволец идёт в ближние spikes x=700..800 и оставляет pinned body
|
||||
→ второй прыгает с x≈520 через первое тело и погибает на spikes x=930..1030
|
||||
→ третий возвращается и одним прыжком пересекает две раздельные опоры
|
||||
→ отдельным jump edge входит на ledge x=1240..1520 и забирает collectible
|
||||
→ достигает goal с deaths=2, corpses=2
|
||||
```
|
||||
|
||||
**Контракт:** две раздельные spike-зоны делают обе жертвы наблюдаемыми и не
|
||||
позволяют одним ранним телом случайно закрыть весь hazard. Bot fail-fast отклоняет
|
||||
третью смерть; три последовательных запуска доказывают очистку старых тел.
|
||||
|
||||
## Уровень 21 — `Held Open`
|
||||
|
||||
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
|
||||
**Ожидаемые и доказанные смерти:** `1`; Door остаётся открыта телом.
|
||||
|
||||
```text
|
||||
LevelID="foundations.held-open", WorldID="foundations"
|
||||
→ первый доброволец достигает saw x=650..742
|
||||
→ тело оседает на pressure plate x=625..785 и активирует held-gate
|
||||
→ следующий доброволец подтверждает allDoorsOpen=true
|
||||
→ начинает прыжок из рассчитанного окна x≈470 и очищает saw + retained body
|
||||
→ прыгает через collectible x=1160 до Door x=1260
|
||||
→ проходит удерживаемую Door и достигает goal с deaths=1, corpses=1
|
||||
```
|
||||
|
||||
**Контракт:** plate и Door используют один signal ID `held-gate`. Коллекционный
|
||||
маршрут лежит внутри того же доказанного прыжка и не требует второй жертвы.
|
||||
|
||||
## Уровень 22 — `Clockwork Step`
|
||||
|
||||
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
|
||||
**Ожидаемые и доказанные смерти:** `0`.
|
||||
|
||||
```text
|
||||
LevelID="foundations.clockwork-step", WorldID="foundations"
|
||||
→ игрок один раз касается toggle ferry x=760..832
|
||||
→ подходит к launch overlap и прыгает на platform x=940..1260
|
||||
→ snapshot подтверждает playerOnGround && playerOnMovingPlatform
|
||||
→ без input едет до platformX≥1280 и по пути забирает collectible x=1435
|
||||
→ сходит на дальний floor x=1600..2500, не касаясь PIT x=1100..1600
|
||||
→ достигает goal без смерти
|
||||
```
|
||||
|
||||
**Контракт:** toggle и moving platform разделяют signal `ferry`. Платформа имеет
|
||||
160 px launch overlap до движения и 20 px far overlap в конечной фазе; bot ждёт
|
||||
реальную поддержку, а не единичное пересечение в воздухе.
|
||||
|
||||
## Проверки, следующие из графов
|
||||
|
||||
1. Сохранять полный integrated device-regression: intended route принятых уровней по три раза и отдельный recovery route уровня 8.
|
||||
|
||||
@@ -49,7 +49,7 @@ finale не вводят новую механику: они проверяют
|
||||
Android `preBuild` зависит от этого gate. Текущее ожидаемое сообщение:
|
||||
|
||||
```text
|
||||
Validated production content matrix: worlds=4; planned=52; authored=1; releaseTotal=69
|
||||
Validated production content matrix: worlds=4; planned=52; authored=5; releaseTotal=69
|
||||
```
|
||||
|
||||
## Content pipeline и Level DoD
|
||||
@@ -75,18 +75,18 @@ errors), затем отсутствующую CLI-команду `validate-matr
|
||||
добавлен отрицательный regression: изменение planned title Level 18 отклоняется
|
||||
как drift реального JSON-префикса.
|
||||
|
||||
Чистый gate на 19 августа 2026 года:
|
||||
Текущий gate после первого Foundations wave на 19 августа 2026 года:
|
||||
|
||||
- `ProductionContentMatrixTest` + `LevelContentToolTest`: `7/7`;
|
||||
- app JVM regression: `116/116`;
|
||||
- `validateLevels`: `18` authored levels;
|
||||
- `validateContentMatrix`: `4` worlds, `52` planned, `1` authored production row,
|
||||
- app JVM regression: `117/117`;
|
||||
- `validateLevels`: `22` authored levels;
|
||||
- `validateContentMatrix`: `4` worlds, `52` planned, `5` authored production rows,
|
||||
release total `69`;
|
||||
- `lintDebug`, `assembleDebug`, `assembleDebugAndroidTest`: GREEN;
|
||||
- APK ZIP integrity: no errors; matrix и `level-18.json` присутствуют в package;
|
||||
- cold unfiltered Android: `57/57`, `1807.264 s`;
|
||||
- debug APK SHA-256:
|
||||
`73d9647f7d5456c79e6fcfa828e0524ccdd5cdf4777a3998c51016c38ce2652c`.
|
||||
`81e50c2b3247a2bf7fad2a2efc461c1d6f19d63e1b10a958e8c1a8544adf48ef`.
|
||||
|
||||
Этот срез не меняет runtime, physics или geometry, поэтому device playthrough
|
||||
матрица остаётся acceptance gate следующего authoring wave, а не подменяется
|
||||
build-time validator тестами.
|
||||
Матрица не подменяет device evidence: Levels 19–22 прошли отдельные routes,
|
||||
restart DoD и полный unfiltered gate; детали — `STAGE6_FOUNDATIONS_WAVE1.md`.
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# Stage 6: Foundations wave 1
|
||||
|
||||
## Принятый результат
|
||||
|
||||
Первый authoring wave расширяет каталог с 18 до 22 уровней и реализует четыре
|
||||
последовательные строки executable content matrix:
|
||||
|
||||
- 19 `First Return` — два раздельных jump edge, `0` смертей;
|
||||
- 20 `Covered Path` — две spike-зоны, ровно `2` тела-моста;
|
||||
- 21 `Held Open` — одно тело удерживает pressure Door;
|
||||
- 22 `Clockwork Step` — toggle включает горизонтальную ferry platform над PIT.
|
||||
|
||||
Каждый уровень имеет RU/EN copy, stable LevelID/WorldID, casualty/time targets,
|
||||
collectible, solution graph и state-driven production-input route. Четыре route
|
||||
methods выполняют по три последовательных запуска без teleport, прямой мутации
|
||||
completion или retry masking.
|
||||
|
||||
## TDD и найденные ошибки
|
||||
|
||||
RED контракты сначала зафиксировали каталог `18 != 22` и отсутствующие четыре
|
||||
`FoundationsScenarios`. Первый device run затем дал четыре независимых RED:
|
||||
|
||||
1. Level 19 прошёл мимо слишком высокого cache (`x=1949.1761`, deaths `0`).
|
||||
Cache перенесён на безопасную дальнюю прямую после двух обязательных прыжков.
|
||||
2. Level 20 одним прыжком пропускал требуемое второе тело (`deaths=1`,
|
||||
firstCorpseX `641.8331`). Один широкий strip разделён на две spike-зоны.
|
||||
3. Level 21 повторно касался дальнего края saw (`x=734.3325`, deaths `2`).
|
||||
Takeoff зафиксирован в рассчитанном окне `x≈470`; physics/saw не менялись.
|
||||
4. Level 22 терял ferry до стабильной посадки (`x=1215.3331`, deaths `1`).
|
||||
Toggle перенесён к launch zone, ferry получила достаточный стартовый overlap,
|
||||
а bot подтверждает `playerOnGround && playerOnMovingPlatform`.
|
||||
|
||||
После GREEN отдельный restart test доказал, что user restart Level 20 удаляет
|
||||
тело/смерть/held input, а Level 22 сбрасывает toggle, platform motion,
|
||||
collectible и input. Первый unfiltered run нашёл один acceptance drift: каталог
|
||||
теперь имеет три страницы, а тест ожидал две. UI-контракт обновлён на страницы
|
||||
1–3 и повторный cold run прошёл полностью.
|
||||
|
||||
## Level DoD evidence
|
||||
|
||||
- JSON validator: `22` levels, format/physics version `1`;
|
||||
- content matrix: `4` worlds, `52` planned, `5` authored production rows,
|
||||
release total `69`;
|
||||
- focused routes: `4/4` methods, `12` playthroughs, `8.372 s`;
|
||||
- focused restart: `1/1`;
|
||||
- app JVM: `117/117`; level-format JVM: `7/7`;
|
||||
- clean `lintDebug`, app APK и AndroidTest APK: GREEN;
|
||||
- final cold unfiltered Android 16: `57/57`, failures/errors `0/0`,
|
||||
instrumentation time `1807.264 s` (`BUILD SUCCESSFUL` in `30m21s`);
|
||||
- APK ZIP: no errors; `22` level JSON packaged;
|
||||
- debug APK SHA-256:
|
||||
`81e50c2b3247a2bf7fad2a2efc461c1d6f19d63e1b10a958e8c1a8544adf48ef`.
|
||||
|
||||
Процедурные visual/audio cues и camera bounds используют принятый общий Canvas
|
||||
pipeline; wave не меняет physics/runtime systems. Следующий bounded authoring
|
||||
slice — Foundations 23–26.
|
||||
Reference in New Issue
Block a user