DejaVu 0.5.0 release validation¶
Status: passed
Validation date: September 9, 2026.
Implementation candidate: 3c949ab335c3b822ba1308201f8b8c7ab8976d80.
Final Android test fixture: fa817151eb3d5d49574ffaa7f90b3203b4ff2a18.
Production library sources are unchanged between these commits.
The release builds against stable Compose Multiplatform 1.12.0 and Android BOM 2026.08.00
(Compose runtime 1.12.0), retaining the Android 1.11 support floor. Kotlin remains 2.4.0;
AGP is 9.4.0, Gradle is 9.6.0, and Android compile SDK is 37.
Local release suite¶
ANDROID_SERIAL=emulator-5554 \
DEJAVU_VALIDATION_DIR=build/release-validation/0.5.0-final \
./test.sh --all-boms
That run completed the multiplatform suites and the minimum Android BOM. The June checkpoint exposed a test setup problem: the new first-update assertion nested two Compose test environments. The manual-rule regression was moved into its own class and now also asserts the displayed value. It passed in isolation on both older BOMs after this test-only correction. The June and August checkpoints were then run in separate build directories and emulators with the final fixture:
ANDROID_SERIAL=emulator-5554 ./gradlew -q --console=plain -PrerunTests \
:dejavu:compileDebugKotlin :dejavu:testDebugUnitTest \
:demo:assembleDebug :demo:assembleDebugAndroidTest \
:compose-experimental:assembleDebug :compose-experimental:assembleDebugAndroidTest \
:demo:connectedDebugAndroidTest :compose-experimental:connectedDebugAndroidTest \
-PcomposeBomVersion=2026.06.01
python3 validation/verify_test_results.py \
dejavu/build/test-results/testDebugUnitTest \
demo/build/outputs/androidTest-results/connected \
compose-experimental/build/outputs/androidTest-results/connected
The same commands passed for BOM 2026.08.00 in the independent copy with emulator-5556.
Reports from each checkpoint are preserved under build/release-validation/0.5.0-final.
| Suite | Tests | Failures | Skips |
|---|---|---|---|
| Core JVM | 229 | 0 | 0 |
| Core iOS simulator arm64 | 229 | 0 | 0 |
| Core Wasm in Chrome | 229 | 0 | 0 |
| Experimental JVM | 26 | 0 | 0 |
| Experimental iOS simulator arm64 | 26 | 0 | 0 |
| Experimental Wasm in Chrome | 26 | 0 | 0 |
| Android BOM 2026.05.00 unit / demo / experimental | 27 / 225 / 20 | 0 | 0 |
| Android BOM 2026.06.01 unit / demo / experimental | 27 / 225 / 20 | 0 | 0 |
| Android BOM 2026.08.00 unit / demo / experimental | 27 / 225 / 26 | 0 | 0 |
The full gate runs tests freshly, checks public API snapshots and lint, compiles all supported library targets, and builds Android test APKs plus desktop/Wasm demos. Older Android BOMs are enforced during compatibility checks. XML reports are preserved separately per BOM.
The 1.12 experimental suite adds six tests for keyed effects, shrinking effect and remember keys,
frame assertions without implicit waits, and nested movable content under LinkBuffer. The
stable-key fixture deliberately recomposes four times while its keyed callback stays quiet;
unkeyed SideEffect remains the oracle. The same 20 original experimental tests run on older
Android checkpoints with an adapter for the changed experimental Styles API.
Packaged artifact checks¶
All six 0.5.0 Maven publications were built locally once at the 1.12 baseline. The standalone consumer build consumes those artifacts rather than recompiling the DejaVu source for each older runtime.
./gradlew :dejavu:publishToMavenLocal --no-configuration-cache
ANDROID_HOME="$HOME/Library/Android/sdk" ./gradlew -p validation/consumer \
jvmTest iosSimulatorArm64Test wasmJsBrowserTest -PdejavuVersion=0.5.0 -PrerunTests
ANDROID_HOME="$HOME/Library/Android/sdk" ANDROID_SERIAL=emulator-5556 \
./gradlew -p validation/consumer connectedDebugAndroidTest \
-PdejavuVersion=0.5.0 -PcomposeBomVersion=2026.05.00
The Android consumer command was repeated at every checkpoint and baseline. The final packaged
artifacts passed two Android tests on each older BOM and three on the 1.12 baseline using a clean
API 36 emulator. JVM, iOS simulator, and Wasm each freshly passed one smoke test after the lifecycle
fixes. The report verifier confirmed no failures, errors, or skips. Reports are preserved under
build/release-validation/0.5.0-final/consumer.
dependencyInsight confirms the consumer resolves runtime-android:1.11.1 at the minimum BOM,
including when the dependency is the published 0.5.0 Android binary built against 1.12.
The AAR metadata declares minCompileSdk=37: Android consumers must use compile SDK 37.
Retaining an older Compose line requires an enforced BOM in application and instrumentation
dependencies; ordinary platform resolution may select the newer transitive baseline.
The public API snapshot adds only delegated Android rule methods hasPendingWork and
runWithoutImplicitWait. Calling these new methods requires Compose 1.12. The packaged consumer
checks existing rule behavior on the older runtimes and the new methods on the release baseline.
Environment and coverage limits¶
- macOS Apple Silicon; JetBrains JDK 21 toolchain; JVM bytecode target 17.
- Older Android BOM source suites: Pixel 10 emulator, API 37, arm64, 16 KB pages (
emulator-5554). - Android 1.12 source suite and packaged consumers: clean Dejavu_Release_API36 emulator, API 36,
arm64, 4 KB pages (
emulator-5556). - iOS 26.5 simulator arm64 and headless Chrome for Wasm.
- Historical hosted Android API 26 and 31 device jobs were not repeated locally.
- iOS device arm64 was compiled and packaged; UI tests run on the simulator.
- Off-screen lazy items must be brought into view before assertions. Non-Android multi-instance attribution can fall back to shared function counts; independent function-level ground truth remains part of the accuracy suite.
Passing local checks replace repeated hosted test matrices under the approved CI budget policy. The final matrix and packaged consumers use the Android lifecycle fixes. The original consumer fixture was also changed to use a named composable with independent SideEffect counts, and its Espresso dependency is aligned with the main suite for API 37.
Publication tracking¶
All six target binaries, POM coordinates, and Gradle module metadata were verified publicly on
Maven Central on September 9, 2026 at 17:22 UTC. The GitHub release was published at 17:23 UTC.
The publication workflow had completed
at 16:53 UTC while Central was still publishing; the GitHub release remained a draft until
the public checks passed. Social copy remains a draft in the shared tracker; no posts were sent.
The documentation deployment
passed; the 0.5.0 documentation is public and owns the
latest documentation alias.
Mixed harness regression¶
The packaged Android consumer exposed a real integration failure: each harness passed alone, but
starting the Android rule before the KMP helper caused activity inspection tables to hide the
helper's explicit tables. The library now combines both snapshot sources. The helper also restores
the previously active tracer and inspector settings when it exits; otherwise a later Android rule
could see the runtime as enabled while tracing was disabled. The Android rule enables tracking
before activity launch so the first composition registers inspection tables even after a previous
test disabled tracking. Dedicated regressions failed before the fixes and check the full
rule/helper/rule sequence plus the first update after disabled-runtime setup, including independent
SideEffect counts and expected budget failures.