Добавить первую волну мира Foundations

This commit is contained in:
2026-08-19 10:51:25 +03:00
parent 4869649b47
commit b31c2ea720
18 changed files with 592 additions and 19 deletions
+5
View File
@@ -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 дней
+73
View File
@@ -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.
+9 -9
View File
@@ -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`.
+56
View File
@@ -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.