diff --git a/README.md b/README.md index e6b7a67..9a20ccf 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,13 @@ Death does not reset the level. A new volunteer respawns after a short delay whi - `Restart` restores the current level. - `II` pauses the game and exposes level selection. - `Settings` on the level-select screen cycles three control sizes, three - opacity presets, and vibration on/off. Changes persist across app restarts. + opacity presets, vibration on/off, Standard/Large text, high contrast, and + English/Russian. Changes persist across app restarts without resetting progress. + +The first level includes a three-step, non-blocking tutorial for movement, +multitouch jumping, and using retained bodies. Completion shows the current run, +saved best, targets, a next goal, and Level select/Replay/Next level routes. Critical +signal, door, and respawn state remains visible when vibration is disabled. The movement constants include 130 ms coyote time and 140 ms input buffering. @@ -59,6 +65,10 @@ matrix with: ./gradlew connectedDebugAndroidTest ``` +The Stage 3 device suite additionally checks persisted controls, RU/EN copy, +accessibility presets, tutorial/result navigation, Back behavior, and safe viewports +on 20:9, 16:9, and 16:10 tablet-sized displays. + The debug APK is written to `app/build/outputs/apk/debug/app-debug.apk`. It is signed with Android's standard debug key and can be installed with: ```sh diff --git a/app/build.gradle b/app/build.gradle index ca520fa..16efb37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId 'com.projectsacrifice.game' minSdk 23 targetSdk 34 - versionCode 6 - versionName '0.5.0-stage3-controls' + versionCode 7 + versionName '0.6.0-stage3-complete' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } diff --git a/docs/CURRENT_ROADMAP.md b/docs/CURRENT_ROADMAP.md index 9c00773..cbb15ed 100644 --- a/docs/CURRENT_ROADMAP.md +++ b/docs/CURRENT_ROADMAP.md @@ -6,7 +6,7 @@ ## 1. Текущее состояние -Инженерная часть этапа 2 завершена; этап 3 начат с настроек мобильного управления: +Инженерная часть этапов 2 и 3 завершена: - реализованы 10 последовательных уровней; - работают движение, прыжок и мобильное multitouch-управление; @@ -19,6 +19,12 @@ - тело, доставленное пилой на `PRESSURE` уровня 10, фиксируется после оседания и больше не соскальзывает с плиты; - restart из промежуточного состояния уровня 10 очищает тела, сигналы, таймер и удерживаемый ввод; - Settings screen сохраняет размер и opacity touch-controls и режим вибрации; три form-factor контракта и защита от повторного held-jump покрыты device-тестами; +- добавлены сохраняемые Standard/Large text и high-contrast режимы, видимый статус сигналов/дверей/respawn и локализованные content descriptions; +- короткое трёхшаговое обучение не блокирует gameplay и после Skip/Done не показывается повторно; +- экран результата разделяет текущий и лучший результаты, показывает targets, следующую цель и рабочие Level select/Replay/Next level переходы; +- весь Canvas UI, десять названий и подсказок доступны на русском и английском; язык хранится отдельно и не меняет progress/control settings; +- Stage 3 focused matrix: 14/14 методов без retries; UI contracts GREEN на 20:9, 16:9 и логическом 16:10 tablet viewport; +- final Stage 3 Android 16 matrix: `OK (30 tests)` без filters/retries за `1,409.366 s`; все intended routes 1–10, recovery/stress, lifecycle, restart и UI/persistence contracts GREEN; - final integrated Android 16 matrix: 16/16 методов, 36 игровых выполнений, lifecycle и restart; wall time `9:32.496`; - финальный debug APK проверен на Android 16: установка, холодный запуск, ZIP-структура и v1/v2-подписи корректны. @@ -176,10 +182,15 @@ Performance-оговорка: исторический критерий этап 8. холодный запуск и проверка crash-буфера; 9. ручной smoke-тест уровня 1 и одного сложного комбинированного уровня. -## 5. Завершение этапа 2 и следующая итерация +## 5. Завершение этапов 2–3 и следующая итерация Инженерный scope этапа 2 закрыт: уровни 1–10 проходят intended route по три раза, уровень 8 имеет restart-free recovery, уровень 10 использует все три тела и сохраняет тело на lift-плите, а restart возвращает чистое состояние. Передаваемые результаты — обновлённый проект, проверенный APK и [`STAGE2_QA_REPORT.md`](STAGE2_QA_REPORT.md). -Этап 3 начат задачей `goon-game-controls-settings`: добавлены сохраняемые пресеты размера/opacity controls и вибрации, фактическое расширение touch target и защита от повторного прыжка при удержании. Проверки выполнены на 20:9, логическом 16:9 и tablet-sized экране; подробности находятся в [`STAGE3_CONTROLS_QA.md`](STAGE3_CONTROLS_QA.md). Следующие slices этапа 3 — accessibility, обучение/result screen и RU/EN локализация. +Этап 3 завершён: к сохраняемым пресетам управления добавлены accessibility, +неблокирующее обучение, полный result flow и RU/EN локализация. Совместный +device-gate проверяет сохранность progress/settings, а UI contracts выполнены на +20:9, 16:9 и tablet-sized экране. Подробный итог находится в +[`STAGE3_QA_REPORT.md`](STAGE3_QA_REPORT.md). Следующая инженерная итерация — этап +4, перенос описаний уровней в валидируемый формат и инструменты контента. Параллельно внешний QA должен выполнить `goon-game-human-playtest`: по две ручные сессии каждого уровня без подсказок разработчика. До получения этого протокола milestone Vertical Slice нельзя называть принятым внешними тестировщиками. diff --git a/docs/STAGE3_ACCESSIBILITY_QA.md b/docs/STAGE3_ACCESSIBILITY_QA.md index 52f4603..1a2edd1 100644 --- a/docs/STAGE3_ACCESSIBILITY_QA.md +++ b/docs/STAGE3_ACCESSIBILITY_QA.md @@ -54,3 +54,9 @@ - localized строки должны заменить английский текст и в Canvas, и в content descriptions одним источником, не удаляя read-only acceptance hooks; - minSdk 23, control settings, progress format и Stage 2 physics/levels не менялись. + +## Финальная интеграция + +Все пять device-методов выполнены в составе unfiltered Android 16 gate: +`OK (30 tests)`, `1,409.366 s`. Итоговая сборка и form-factor evidence описаны в +[`STAGE3_QA_REPORT.md`](STAGE3_QA_REPORT.md). diff --git a/docs/STAGE3_LOCALIZATION_QA.md b/docs/STAGE3_LOCALIZATION_QA.md index e3580b5..a635efc 100644 --- a/docs/STAGE3_LOCALIZATION_QA.md +++ b/docs/STAGE3_LOCALIZATION_QA.md @@ -57,3 +57,9 @@ recreation, progress, control size, opacity, and vibration preservation. - `LevelCatalog.java` and level geometry are not modified. Canvas rendering now uses `GameStrings.levelTitle/levelHint`; the existing English fields remain compatible with gameplay tests and older callers. + +## Final integration + +`GameLanguagePersistenceTest` and the combined Stage 3 RU/EN acceptance tests passed +inside the unfiltered Android 16 gate: `OK (30 tests)`, `1,409.366 s`. See +[`STAGE3_QA_REPORT.md`](STAGE3_QA_REPORT.md) for the release evidence. diff --git a/docs/STAGE3_ONBOARDING_RESULT_QA.md b/docs/STAGE3_ONBOARDING_RESULT_QA.md index 04ae5c6..604abe1 100644 --- a/docs/STAGE3_ONBOARDING_RESULT_QA.md +++ b/docs/STAGE3_ONBOARDING_RESULT_QA.md @@ -55,3 +55,10 @@ BUILD SUCCESSFUL `Saved best`. 4. По очереди проверить `Level select`, `Replay`, `Next level`; завершённость уровня, unlocked level и control preset должны сохраниться. + +## Финальная интеграция + +`OnboardingStoreTest`, оба `OnboardingAndResultFlowTest` и объединённый RU/EN +acceptance прошли в составе unfiltered Android 16 gate: `OK (30 tests)`, +`1,409.366 s`. Релизная версия назначена `0.6.0-stage3-complete`; общий отчёт: +[`STAGE3_QA_REPORT.md`](STAGE3_QA_REPORT.md). diff --git a/docs/STAGE3_QA_REPORT.md b/docs/STAGE3_QA_REPORT.md new file mode 100644 index 0000000..2805c51 --- /dev/null +++ b/docs/STAGE3_QA_REPORT.md @@ -0,0 +1,93 @@ +# Stage 3 QA report + +Дата: 18 августа 2026 года. + +Версия: `0.6.0-stage3-complete` (`versionCode=7`). + +## Результат + +Инженерный scope этапа 3 завершён. В общую сборку интегрированы: + +- сохраняемые размер и прозрачность touch-controls и режим вибрации; +- Standard/Large text, high contrast, видимые состояния сигналов, дверей и respawn; +- локализованные accessibility descriptions; +- полная RU/EN локализация Canvas UI, десяти названий и подсказок уровней; +- неблокирующее трёхшаговое обучение с постоянным Skip/Done; +- result screen с текущим и лучшим результатом, targets, следующей целью и + рабочими переходами Levels/Replay/Next; +- совместная сохранность языка, accessibility, controls и прогресса после recreate; +- state-driven боты уровней 1–10, restart-free recovery уровня 8 и проверка + неподвижного тела на lift-плите уровня 10. + +## Автоматические проверки + +Финальный clean gate: + +```text +./gradlew clean testDebugUnitTest lintDebug assembleDebug assembleDebugAndroidTest +BUILD SUCCESSFUL +66 actionable tasks +42/42 JVM tests +``` + +Финальный unfiltered device gate выполнен на холодно запущенном Android 16 AVD, +физический размер `1080x2400` (20:9), после установки точных APK clean-сборки и +`pm clear com.projectsacrifice.game.debug`: + +```text +AndroidJUnitRunner +Tests run: 30 +Time: 1,409.366 s +OK (30 tests) +``` + +Runner запускался без `-e class`, retries и повторного запуска отдельных методов. +Матрица включает все intended routes уровней 1–10 по три раза, дополнительные +stressed/recovery маршруты уровня 8, throttled mastery и sliding-body regression +уровня 10, lifecycle, restart и все Stage 3 persistence/UI contracts. + +До финального объединения UI contracts также прошли на логических viewport: + +- 16:9 safe viewport — GREEN, `66.208 s`; +- 16:10 tablet-sized `2560x1600` landscape — GREEN, `167.823 s`; +- focused Stage 3 matrix — 14/14 GREEN, `576.355 s`. + +Последующие изменения касались automation/read-only snapshot и не меняли UI +геометрию; финальный 20:9 gate повторно проверил весь интегрированный интерфейс. + +## RED → GREEN evidence + +Первый полный 30-тестовый прогон был завершён полностью и дал 27/30 GREEN. Три +нагрузочные границы были исправлены без изменения физики уровней или retry: + +1. Level 3: takeoff начинался на несколько пикселей поздно (`x=505.67633`, + `y=664.41797`, лишняя смерть). State-driven точка старта получила запас и + повторно прошла 3/3 внутри полного load-order. +2. Level 6: координатный checkpoint не доказывал опору на frozen block; добавлен + обязательный `playerOnGround`, после чего landing route прошёл 3/3. +3. Level 10: бот мог прыгнуть на лифт во время его восходящей фазы и упасть в PIT + (`x=1942.7063`, deaths=4). Snapshot расширен read-only направлением движения; + посадка разрешается на нисходящей фазе, normal 3/3 и throttled route GREEN. + +Level 8 отдельно получил исходящую фазу горизонтальной платформы, безопасное +позиционирование под recovery relay и перед финальным прыжком. Финальный suite +подтвердил stressed 1/1, intended 3/3 и recovery 3/3 без смерти/restart. + +## Проверка APK + +Финальный `app-debug.apk` проверен как самостоятельный устанавливаемый артефакт: + +- ZIP/APK-структура: `unzip -t` без ошибок; +- package: `com.projectsacrifice.game.debug`; +- версия: `versionCode=7`, `versionName=0.6.0-stage3-complete-debug`; +- `minSdkVersion=23`, `targetSdkVersion=34`; +- подпись: `apksigner verify` GREEN, схемы v1 и v2; +- SHA-256: `7be25ea96cf0de7ea1930335b3570bd9def93cdb48029e24e4c9c14078e4195d`; +- clean install и cold launch на Android 16: `Status: ok`, `LaunchState: COLD`, + `TotalTime: 1401 ms`; crash-буфер пуст. + +## Границы приёмки + +Инженерный Stage 3 gate закрыт. Отдельная задача ручного внешнего playtest остаётся +открытой: реальные тестировщики должны пройти каждый уровень без подсказок +разработчика. Этот внешний протокол не подменяется автоматическими ботами.