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 taggedv1.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
60144767has protected main. A fresh API read confirmsci_push_repository_for_job_token_allowed=trueafter the user enabled it. -
Shared
v0.1.0resolves to22e686b413f6e28e285d22bb9826ae3f21f0c614bd116ad54dd55daa14022fd1. The initial release commit pinned that SHA. Following the fresh CI failure described below, all four adapters adopt the immutable JDK-availability fixb5e32e4ea43cdd85a4ac278261f3a944c393a6100b6aa66f15edcdfe38256a05as bothrefandtemplate_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.5app 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 |
|
1.5/code 6 APK |
|
1.5/code 6 AAB |
|
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 |
|
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 |
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.