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

This commit is contained in:
2026-08-19 11:25:52 +03:00
parent b31c2ea720
commit 4d8aa28f0a
19 changed files with 556 additions and 25 deletions
+8 -1
View File
@@ -217,7 +217,14 @@ Android matrix `52/52` (`551.773 s`). Evidence — `STAGE6_CHALLENGES.md`.
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.
Evidence — `STAGE6_FOUNDATIONS_WAVE1.md`.
Второй bounded wave Levels 23–26 также принят: remote saw delivery, frozen step,
conductive relay и timed ferry с дальним recovery relay имеют solution graphs,
collectibles и 15/15 последовательных production-input playthroughs. Cold
unfiltered candidate прошёл Android `62/62` за `1063.114 s`, app JVM `118/118`,
content-tool JVM `7/7`; APK содержит все 26 level JSON. Evidence —
`STAGE6_FOUNDATIONS_WAVE2.md`; следующий slice — Levels 27–30, включая Foundations
challenge и finale.
### Этап 7. Техническая стабилизация и release engineering — P0, 4–8 дней
+72
View File
@@ -535,6 +535,78 @@ LevelID="foundations.clockwork-step", WorldID="foundations"
160 px launch overlap до движения и 20 px far overlap в конечной фазе; bot ждёт
реальную поддержку, а не единичное пересечение в воздухе.
## Уровень 23 — `Remote Volunteer`
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
**Ожидаемые и доказанные смерти:** `1`; доставленное тело удерживает Door.
```text
LevelID="foundations.remote-volunteer", WorldID="foundations"
→ первый доброволец входит в saw x=600..696 и получает impulse (550,-700)
→ тело попадает на raised pressure plate x=1030..1200 и открывает remote-gate
→ следующий доброволец стартует прыжок до saw и остаётся жив
→ перепрыгивает доставленное тело, забирает cache x=1180
→ проходит Door x=1540..1622 и достигает goal с deaths=1, corpses=1
```
**Контракт:** дистанционно доставленное тело является единственным источником
pressure-сигнала. Маршрут не маскирует повторную смерть и ограничен максимум одной
жертвой на каждом шаге.
## Уровень 24 — `Frozen Step`
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
**Ожидаемые и доказанные смерти:** `1`; одно замороженное тело становится ступенью.
```text
LevelID="foundations.frozen-step", WorldID="foundations"
→ первый доброволец замерзает в FREEZER x=720..820
→ следующий прыгает и стабилизируется на frozen body на y≈680
→ отдельным jump edge поднимается на ledge x=850..1410, y=590
→ забирает cache x=1280 и перепрыгивает на ledge x=1500..2200
→ достигает верхнего goal с deaths=1, corpses=1
```
**Контракт:** без сохранённого frozen body высота первого уступа недостижима
доказанным маршрутом; бот отдельно наблюдает устойчивую опору на теле.
## Уровень 25 — `Living Wire`
**Статус:** доказан production-input ботом, 3/3 последовательных прохождения.
**Ожидаемые и доказанные смерти:** `1`; проводящее тело постоянно питает Door.
```text
LevelID="foundations.living-wire", WorldID="foundations"
→ первый доброволец погибает в ELECTRIC x=720..830
→ conductive corpse активирует relayId="living-power" и открывает Door
→ следующий стартует прыжок до live relay
→ перелетает тело, забирает cache x=1100 на безопасном полу
→ проходит Door x=1350..1434 и достигает goal с deaths=1, corpses=1
```
**Контракт:** Door открывается только живым relay-сигналом сохранённого conductive
body; каждый шаг fail-fast запрещает вторую смерть.
## Уровень 26 — `Second Hand`
**Статус:** доказаны два production-input маршрута, каждый 3/3.
**Ожидаемые и доказанные смерти:** `0` для original timer и recovery.
```text
LevelID="foundations.borrowed-time", WorldID="foundations"
→ TIMED switch x=760 запускает second-hand на 9 s и outbound ferry
→ игрок ждёт boarding phase, садится на platform x=940..1300
→ едет до platformX≥1250 и прыгает на far floor x=1580..2700
→ intended: проходит Door x=1920 на исходном таймере
→ recovery: ждёт закрытия Door и прыгает в высокий relay x=1700,y=650 на 4 s
→ оба маршрута поднимаются на ledge x=2230..2700, забирают cache x=2350
→ достигают верхнего goal без смерти
```
**Контракт:** recovery relay использует тот же `second-hand`, но расположен над
обычным беговым маршрутом. Отдельный тест сначала наблюдает реально закрытую Door,
затем её повторное открытие — softlock после истечения исходного таймера исключён.
## Проверки, следующие из графов
1. Сохранять полный integrated device-regression: intended route принятых уровней по три раза и отдельный recovery route уровня 8.
+15 -14
View File
@@ -49,7 +49,7 @@ finale не вводят новую механику: они проверяют
Android `preBuild` зависит от этого gate. Текущее ожидаемое сообщение:
```text
Validated production content matrix: worlds=4; planned=52; authored=5; releaseTotal=69
Validated production content matrix: worlds=4; planned=52; authored=9; releaseTotal=69
```
## Content pipeline и Level DoD
@@ -64,29 +64,30 @@ JSON-уровень добавляется только ведущим преф
5. restart, blocker-softlock и collectible/challenge проверки;
6. camera, sound, art, optimization и QA regression gates из Level DoD.
Следующий authoring wave — Foundations 19–30. Уровни добавляются небольшими
вертикальными срезами; незавершённый уровень не скрывается в общем счётчике
production-контента.
Foundations 19–26 уже авторизованы через этот pipeline. Следующий bounded slice —
Levels 27–30, включая challenge и finale мира; незавершённый уровень не
скрывается в общем счётчике production-контента.
## TDD и gate первого среза
## TDD и текущий gate
RED сначала зафиксировал отсутствующий `ProductionContentMatrix` (15 compile
errors), затем отсутствующую CLI-команду `validate-matrix` (exit `2`). После GREEN
добавлен отрицательный regression: изменение planned title Level 18 отклоняется
как drift реального JSON-префикса.
Текущий gate после первого Foundations wave на 19 августа 2026 года:
Текущий gate после второго Foundations wave на 19 августа 2026 года:
- `ProductionContentMatrixTest` + `LevelContentToolTest`: `7/7`;
- app JVM regression: `117/117`;
- `validateLevels`: `22` authored levels;
- `validateContentMatrix`: `4` worlds, `52` planned, `5` authored production rows,
- app JVM regression: `118/118`;
- `validateLevels`: `26` authored levels;
- `validateContentMatrix`: `4` worlds, `52` planned, `9` 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`;
- APK ZIP integrity: no errors; `26` level JSON присутствуют в package;
- cold unfiltered Android: `62/62`, failures/errors `0/0`, `1063.114 s`;
- debug APK SHA-256:
`81e50c2b3247a2bf7fad2a2efc461c1d6f19d63e1b10a958e8c1a8544adf48ef`.
`67510d404cfa0704500cbf36c7845e9ba9fa05e96630079ab02bc35113e946fa`.
Матрица не подменяет device evidence: Levels 19–22 прошли отдельные routes,
restart DoD и полный unfiltered gate; детали — `STAGE6_FOUNDATIONS_WAVE1.md`.
Матрица не подменяет device evidence: Levels 19–26 прошли отдельные routes и
полный unfiltered gate; детали — `STAGE6_FOUNDATIONS_WAVE1.md` и
`STAGE6_FOUNDATIONS_WAVE2.md`.
+58
View File
@@ -0,0 +1,58 @@
# Stage 6: Foundations wave 2
## Принятый результат
Второй bounded authoring wave расширяет каталог с 22 до 26 уровней:
- 23 `Remote Volunteer` — saw доставляет одно тело на поднятую pressure plate;
- 24 `Frozen Step` — одно frozen body становится обязательной ступенью;
- 25 `Living Wire` — одно conductive body постоянно питает relay и Door;
- 26 `Second Hand` — timed ferry над PIT и высокий far-side recovery relay.
Имя Level 26 изменено с дублирующего `Borrowed Time` на уникальное `Second Hand`;
stable ID `foundations.borrowed-time` сохранён, поэтому identity и будущие saves
не зависят от редактируемого display title.
Все уровни имеют RU/EN copy, stable LevelID/WorldID, casualty/time targets,
collectible и solution graph. Пять Android methods выполняют по три
последовательных production-input route: по одному для Levels 23–25 и два для
Level 26 — исходный таймер и восстановление после его истечения.
## TDD и найденные ошибки
RED сначала зафиксировал каталог `22 != 26`, затем отсутствие
`AdvancedFoundationsScenarios`. Device-прогоны обнаружили конкретные ошибки
контента и choreography:
1. Level 23 останавливался перед raised platform (`x=838`); подход к обязательному
прыжку перенесён раньше без изменения saw/physics.
2. Level 25 проходил ниже слишком высокого cache; cache перенесён на доказанный
безопасный ground route.
3. Оба маршрута Level 26 падали в PIT около `x=1128`; TIMED switch перенесён к
launch zone, а ferry получила достаточный boarding overlap и state-driven
launch policy.
4. После пересечения PIT Level 26 проходил под cache (`x=2638`); финальный путь
разделён на наблюдаемую посадку на верхний ledge и отдельный сбор cache, а
ledge сдвинут так, чтобы требовать этот подъём.
Финальный focused suite прошёл `5/5` methods — `15` route executions за
`10.768 s`. Recovery route трижды ждёт `allDoorsOpen=false` на дальней стороне,
активирует высокий relay и только затем проходит вновь открытую Door. Retry,
teleport и прямая мутация completion отсутствуют.
## Level DoD evidence
- JSON validator: `26` levels, format/physics version `1`;
- content matrix: `4` worlds, `52` planned, `9` authored production rows,
release total `69`;
- focused routes: `5/5` methods, `15` playthroughs, `10.768 s`;
- app JVM: `118/118`; level-format JVM: `7/7`;
- clean `lintDebug`, app APK и AndroidTest APK: GREEN;
- final cold unfiltered Android 16: `62/62`, failures/errors `0/0`,
instrumentation time `1063.114 s` (`BUILD SUCCESSFUL` in `17m55s`);
- APK ZIP: no errors; `26` level JSON packaged;
- debug APK SHA-256:
`67510d404cfa0704500cbf36c7845e9ba9fa05e96630079ab02bc35113e946fa`.
Wave не меняет глобальную physics/runtime модель. Следующий bounded slice —
Foundations 27–30, включая challenge и finale этого мира.