Thanks for improving Retra.
- Keep ROM identity, saves and user data backward compatible.
- Do not bundle commercial ROMs, BIOS files, artwork or copyrighted game assets.
- Keep emulation timing independent from UI refresh-rate changes.
- Preserve independent portrait and landscape controller layouts.
- Add or update regression tests for behavior changes.
Run the local release gate:
python3 tools/release_gate.pyFor Android work, also run:
./gradlew :app:compileDebugKotlin :app:testDebugUnitTest :app:lintDebugA full native APK build additionally requires the validated mGBA source checkout expected by app/src/main/cpp/CMakeLists.txt.
- Do not commit
local.properties, Android Studio workspace files, generated APK/AAB files, signing keys,.envfiles, native build output, or Gradle caches. tools/prepare_mgba.pypreparesthird_party/mgba/locally; commit the lock metadata inthird_party/mgba.lock, not the generated mGBA checkout.- Keep release documentation and version-specific links current when changing public release metadata.
Prefer focused controllers/repositories over adding responsibilities back into MainActivity. Keep Web UI features in bounded modules and avoid per-frame preference/database/file I/O.
Describe:
- the user-visible change;
- persistence/migration impact;
- performance impact;
- tests performed;
- devices/Android versions used for behavior that depends on hardware, Bluetooth, Wi-Fi, insets or refresh rate.
Retra public releases use Semantic Versioning:
1.0.x— backward-compatible fixes and release hardening;1.x.0— backward-compatible feature releases;2.0.0— major changes that intentionally break compatibility or substantially redefine public behavior.
Do not reintroduce legacy internal build identifiers as public release versions. Pre-v1.0 milestones are maintained in docs/DEVELOPMENT_HISTORY.md.
Before adding behavior to MainActivity, check whether it belongs in an existing controller/repository or a new focused component. Keep MainActivity as lifecycle/composition glue, keep controller feedback out of pointer-input code, and keep shared domain models outside Activity nested classes.
Run python3 tools/release_gate.py before submitting changes; the architecture regression tests enforce these boundaries. See docs/ARCHITECTURE.md.