Skip to content

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.