Skip to content
sysout.dev

Homey 1.5 release-preparation validation

Pre-commit local validation of Homey 1.5/code 6, including fresh signed installation and a signed 1.4 upgrade.

The local release-preparation gate passed before the release commit. The scope is the existing recipe-catalogue extraction, About screen, and shared delivery adoption. No new household feature or database migration is included.

Source and service checks

  • Refreshed live main: 77a1a3aae5042a9e8dc524bdb41e73c082aa64d1, also tagged v1.4.

  • Refreshed feature baseline: 3bc9dcf7eb42bbbc300b178554242c501c80e498, three commits beyond main. Release preparation adds version 1.5/code 6 and its delivery payload.

  • The user confirmed that 1.4 is the latest Play upload and 1.5 is available. The previous source release is 1.4/code 5. Play history, Secure Files, signing variables, Play integration, app permissions and Internal/Alpha setup are user-confirmed; they were not independently inventoried in Play Console or CI settings by this session.

  • GitLab project 60144767 has protected main. A fresh API read confirms ci_push_repository_for_job_token_allowed=true after the user enabled it.

  • Shared v0.1.0 resolves to 22e686b413f6e28e285d22bb9826ae3f21f0c614bd116ad54dd55daa14022fd1. The initial release commit pinned that SHA. Following the fresh CI failure described below, all four adapters adopt the immutable JDK-availability fix b5e32e4ea43cdd85a4ac278261f3a944c393a6100b6aa66f15edcdfe38256a05 as both ref and template_revision. The stable tag is unchanged.

  • App/shared tag protection is unavailable in the current account; the user explicitly accepted proceeding. Immutable shared commit pins preserve include identity. The live v1.5 app tag was absent at the final pre-commit check.

  • Generic CI execution remains in the shared repository. Homey supplies include-only adapters, root mode/guard configuration, notes, listing text and a data-only artwork manifest.

The initial working tree contained only the local tooling-parallel edit in gradle.properties. It remains unchanged and excluded from the release. Its SHA-256 is cb05708b419bdc7be4eea0794808d5015c6dbd47d9137273a37389c07d193665.

Build and configuration validation

Builds used isolated source copies under build/release-validation, with committed Gradle settings and local signing configuration. Tracked candidate files were compared with the working release files, normalising line endings; the only intentional exclusion was the preserved local Gradle edit.

The toolchain remains Gradle 8.11.1, AGP 8.10.1, Kotlin 2.0.21 and KSP 2.0.21-1.0.28. Local builds used Android Studio’s JBR 21.0.10. Per-invocation C:\jtmp temporary paths resolved the Windows Gradle loopback startup failure. The candidate used one worker, a 2 GiB Gradle heap and in-process Kotlin compilation. These local resource settings are not committed.

.\gradlew.bat :app:verifyReleaseTag :app:verifyNoMojibake `
  testDebugUnitTest :meal-domain:test :app:lintDebug `
  :app:assembleDebug :app:assembleRelease :app:bundleRelease `
  '-PreleaseTag=v1.5' --no-daemon --max-workers=1 --console=plain
  • Candidate gate: passed, 351 actionable tasks. Tests ran in the app, meal-catalog and meal-data modules: 71 tests, 0 failures, 0 errors, 0 skipped, across 25 suites. The meal-domain and so-compose test tasks had no test sources.

  • Debug lint: passed, 0 errors, 33 warnings and 1 hint. Release-critical lint passed during signed assembly.

  • Encoding and release-tag checks: passed.

  • Debug APK: dev.sysout.homey.debug, 1.5-debug, code 6, label Homey Debug. That label already existed in 1.4 and is not a new release feature.

  • Signed minified release APK and AAB: dev.sysout.homey, 1.5, code 6, min SDK 24, target SDK 36.

  • Include-only adapters, immutable revisions, YAML, listing paths, unique artwork destinations and text length limits: passed. The code-6 Play notes contain 188 characters and match the canonical release notes.

  • Existing listing assets: 512x512 icon, 1024x500 feature graphic, and five ordered 1080x2400 phone screenshots.

The 1.4 baseline was freshly assembled from the exact tag and passed its release build, minification and release-critical lint gate.

Artifact identity and signatures

SDK 36.1.0 apksigner verified both release APKs, including APK Signature Scheme v2. JDK jarsigner verified the AAB. Google bundletool 1.18.3 validated the bundle and independently decoded its package, versions and SDK levels. The bundletool executable hash matched the digest published by Google’s release API.

All three signed artifacts use certificate SHA-256: 0a9fa9793c73f9e45568fed5a9b44cf584e490d4a0f4b4a87e543d519de2923a.

Artifact SHA-256

Fresh tagged 1.4/code 5 APK

8244a8ad4978a409b848c672a50f0fe1a15fb632a8dba7caf726ce5a0f816724

1.5/code 6 APK

ea7c92e0294e155d4ded5f74ccb818bef13dc59d4509b115a6ff987959ac4384

1.5/code 6 AAB

92ee6b00b7bbd15406b93ac17e8eb654dcbde90f745b647d15a048229a9ec467

Versioned release outputs are retained locally at build/release-validation/artifacts/homey-1.5-code6.apk and homey-1.5-code6.aab. The original loose build outputs were preserved.

Signed device validation

AVD: Homey_API_36, serial emulator-5560, API 36, x86_64. Tested package: dev.sysout.homey; launcher: dev.sysout.homey/.MainActivity.

Before testing, the release package was absent. The existing dev.sysout.homey.debug installation remained at 1.0.1-debug/code 2 with unchanged installation/update timestamps throughout testing.

Check Observed result

Fresh signed 1.5 installation

Installed and launched successfully. Setup offered all four starter recipes with correct default selections. Creating the home saved Oats Porridge, Paneer Bhurji, Tomato Pasta and Vegetable Pulao exactly once each. About displayed Version 1.5 and Build 6.

Prepared signed 1.4 baseline

Created a 1 BHK sample home, selected three Indian recipes and left Tomato Pasta unselected. Added the synthetic location RC14, producing five locations. The baseline recipe list contained the three selected recipes and one missing catalog offer.

In-place signed upgrade

adb install -r of the verified 1.5 APK succeeded. Setup state, all five locations including RC14, and the three selected recipes survived. Android’s reported firstInstallTime=2026-10-22 01:41:53 was unchanged; version became 1.5/code 6.

Catalogue continuity after upgrade

The new-recipe review offered only Tomato Pasta. Adding it produced four unique recipes and removed the new-recipe banner. Previously installed recipes were not offered again.

Identity and stability after upgrade

About again displayed Version 1.5 / Build 6. Homey’s process remained alive, the crash buffer contained no Process: dev.sysout.homey, entry, and the existing debug package was unchanged.

The emulator initially displayed unrelated Digital Wellbeing and System UI ANR dialogs during cold boot. They were dismissed before the completed app journeys. Notification permission was deferred; notification delivery was not exercised.

These are emulator checks using the local upload-key-signed APKs. They establish the tested data/recipe upgrade behavior and local signing continuity. They do not establish physical-device coverage or compatibility with a separately Play-signed installed APK when Play App Signing uses another distribution certificate.

Local evidence is retained under build/release-validation: baseline-build.log, candidate-gate.log, artifact-check.json, delivery-check.json, device-check.json, and device-evidence/ XML/screenshots/package records. These generated files and signing material are excluded from the release commit.

See the automation decision record for the local Python/ADB helper’s purpose, limits, and a later evaluation of standard UI automation.

Fresh CI failure and Java analysis

The first pushed release-preparation commit, 4aaa612, produced pipeline 2973746984. All three verification jobs failed before task execution because meal-domain required a Java 17 compiler that the Linux image did not contain. This was a current setup failure, not a quota failure or a failing app test.

meal-domain has declared jvmToolchain(17) since commit 7115363 on August 5, and the same declaration exists in tagged 1.4. Homey’s August 29 CI adoption commit 3bc9dcf selected the current Android SDK image. Inspection of that exact image digest’s registry configuration confirms it installs OpenJDK 21. The jobs reported JDK 21.0.11 and no matching JDK 17 toolchain; no download repository was configured.

The local javaToolchains report independently explains the successful workstation build: Gradle runs on JBR 21.0.10 and discovers Eclipse Temurin 17.0.8.1 through the Windows registry. Thus the successful local environment supplied both JDKs; the container supplied only one.

Repository Relevant declaration Current inspected CI image

Homey

Android modules target Java 17 bytecode; meal-domain explicitly requests JDK 17.

mobiledevops image with JDK 21; missing JDK 17 exposed by this pipeline.

Treeger

Java/Kotlin target 17; no explicit JDK 17 toolchain declaration found in its build files.

Same mobiledevops image. A target alone does not request an installed JDK of that exact major.

Asciitor

Android app explicitly requests JDK 17.

Same mobiledevops image, so the inspected configuration appears exposed to the same mismatch; no fresh Asciitor pipeline was run here.

Little Bloomers / IMH

Android app targets Java 11; IMH’s whisperNative additionally requests JDK 17.

Different pinned saschpe image. Its exact registry configuration contains Temurin JDK 17.0.19.

The Gradle toolchain contract distinguishes runtime JDK, selected compile/test toolchain, and source/bytecode compatibility. This incident does not establish that Homey should change its target or upgrade Gradle/AGP.

Shared branch codex/android-jdk-toolchain adds an optional java_toolchain_version input with an empty default, and one shared setup block used by verify and release. Homey requests 17; the existing SDK image remains pinned. The setup reuses a matching JDK under JAVA_HOME or /usr/lib/jvm, or installs and verifies the requested Debian/Ubuntu JDK package as root. Eight isolated standard-library unittest cases passed, covering existing compilers, installation and failure paths. Other consumers retain their existing behavior unless they adopt the new commit and opt in.

This follow-up changes only delivery configuration and engineering documentation. App sources, dependencies, Gradle/AGP/Kotlin versions, package/version fields, and the locally validated signed artifacts are unchanged. Merge the shared fix before Homey, retaining its adopted commit in shared history. The final handoff records the fresh consumer pipeline outcome; the failed first pipeline is not represented as a passed CI gate.

Handoff

Run and inspect fresh normal branch CI after pushing the release-preparation commit. The final handoff supplies that pipeline’s URL and outcome. Historical quota failures are not used as current verification evidence.

The user handles merging and publishing. Protected-default-branch testing publication and independent listing sync have not been executed during preparation. Follow Release and listing delivery after merging; require successful testing-track publication and the listing job’s persisted text/image read-back before claiming those external outcomes.