Skip to content
sysout.dev

Android release delivery

Current candidate

In My Head 0.4, version code 4, package dev.sysout.inmyhead. The release tag is v0.4. Version 0.3/code 3 was already installed as the production app; do not reuse that version code for this release.

The source includes chunk checkpoints/recovery, transcription of closed chunks during microphone capture, the foreground queue, and corrected live activity feedback. The user confirmed force-kill/reopen recovery and during-capture processing on the phone. Numerical chunk counts stay in the notification only. The proposed combined Recording/Transcribing layout remains deferred.

Shared CI ownership and pin

The app’s three adapters under .gitlab/ci/ contain include/input data only. They all use the same immutable shared revision in both ref and template_revision:

67617411c8929d2fd38a947800b728e15255d0a38d0c28acc8d1d246758859b5

This is the cleaned shared-template revision also adopted by Asciitor. It exists on the shared repository’s unmerged probe/android-emulator-2026-11-01 branch; the app pins the commit, not the branch. The live shared main was still abe74c44…​ when checked on 2026-11-06. The older v0.1.0 tag predates the SDK setup fix and the unconditional test-APK compilation; it is not equivalent.

  • verify-combined.yml runs lint, the app unit-test entry point, and builds the Debug app and instrumentation APKs. The app unit-test task finalizes with :shared:jvmTest; its JUnit results are copied into the app report directory expected by the shared template. This keeps all shared recovery tests in CI.

  • release.yml provides the protected-main manual tag gate and signed AAB build.

  • publish.yml uploads that pipeline’s signed AAB and version-specific notes to Internal testing and the shared default additional Alpha (Closed testing) track. The app adapter inherits additional_play_tracks from the shared template.

The initial 0.4 publication targeted Internal only because the app explicitly overrode the additional tracks with an empty value. Removing that override applies the shared default to future pipelines; it does not promote the already published 0.4 build or change its existing tracks.

The Android build inputs are platform android-37.0, Build Tools 36.1.0, the existing digest-pinned Android SDK image, and an explicit Java 17 toolchain. Generic setup, guards, signing orchestration, and publication remain in the shared CI project. No local Fastfile, custom publishing job, or copied CI script is added to IMH.

GitLab Maven dependency verification

dev.sysout:model-core:0.1.0 is now configured using Homey’s consumer pattern: exclusive dev.sysout resolution from sysout-platform’s project 87989353 Maven registry, CI_JOB_TOKEN in CI, and user-level gitLabPrivateToken locally. Implicit local Maven fallback is removed; only explicit local publication validation can use a file repository, and -Pci rejects that override.

The source now lives in sysout-platform’s model-core/ module, imported with its three relevant history commits and an original/new commit map. Platform’s tooling is aligned with the apps. Its verification passed all five existing tests and Android release lint; model-core compiled and published locally for Android, JVM, JS and Wasm. It has no unit test sources; iOS needs a macOS host.

On 2026-11-07, IMH passed all 42 JVM tests, lint and Debug app/test APK builds against that isolated publication. MOM’s Debug build, lint and instrumentation compilation also passed; 3 of its 105 JVM tests failed and 8 were skipped, while all 26 Android-library tests passed. The same three failed tests reproduced with identical failure messages on checkpoint 35912d8, before the dependency change. Its statement-extraction implementation was not changed during this migration. See model-core integration.

Remote publication and local registry consumption are now verified. Platform MR !2 was merged without squashing, and protected-main publication pipeline 3039312496 passed. The root, Android and JVM metadata return HTTP 200. IMH then passed all 42 tests, Debug app/test APK builds and lint with -Pci, refreshed dependencies and no local repository override. The signed APK/AAB were also rebuilt from the registry dependency, retain the production upload certificate, and pass signature, APK ZIP alignment and 16 KB alignment checks for all 21 64-bit native libraries.

Hosted IMH package access still needs configuration. Platform’s inbound job-token allowlist includes Homey, Little Bloomers and itself, but not IMH. Add sysout-dev/imh-project/imh-app (84970820) there before hosted verification can resolve the private package. Local private-token success does not establish CI job-token access. The producer’s shared CI pin 99f17f4…​ is available remotely; the IMH app adapters retain their shared Android template pin above.

The rebuilt signed release was fresh-installed on Medium_Phone_API_35 (emulator-5560, API 35, x86_64, 4096-byte pages) in read-only/no-snapshot mode. Version 0.4/code 4 cold-launched successfully in 3525 ms, remained running without an app fatal crash, and displayed the expected initial screen. A first boot showed a Pixel Launcher ANR overlay; the isolated retry with normal resources produced a clean screen. The original AVD and physical phone data were unchanged.

Protected GitLab and Play prerequisites

Before the first CI publication, check the following in the IMH project:

  • Protected main and intended v* tag creation permissions.

  • Job-token Git push enabled. The project API reported this enabled on 2026-11-06; the shared tag job uses CI_JOB_TOKEN without a new persistent token.

  • Secure File named in-my-head-upload.p12, matching the existing upload key.

  • Protected/masked ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, and ANDROID_KEY_PASSWORD, with the correct environment scope.

  • Protected SUPPLY_JSON_KEY_DATA (or the existing Google Play integration) with access to this Play app and testing releases. Internal testing must exist.

  • An unused version code 4 in Play. The local tag guard matches v0.4; Play’s uploaded version codes were not accessible in this preparation session.

Authenticated REST checks on 2026-11-07 returned empty project Secure Files and variables lists. Neither the IMH subgroup nor the Sysout parent group contains the required inherited signing/Play variables, and the active-integration list contains no Google Play integration. The signing file and variables above, plus a protected Play credential/integration, must therefore be configured before the release pipeline can publish. Use the existing upload keystore and the matching local key.properties values; do not create a new signing identity.

The GitLab connector does not expose these settings, and the configured local token has read_api only. These checks did not change credentials, permissions, Secure Files, tracks or tags. Play’s unused-version-code and Internal-track availability still require verification. The historical August quota failure is not evidence of current runner capacity; platform’s new hosted pipelines passed.

Release sequence

  1. Verify GitLab model-core resolution and the protected setup prerequisites.

  2. Push the prepared branch and let normal verification pass, then review/merge through the normal project workflow.

  3. From protected main, start a web pipeline with RELEASE_TAG=v0.4.

  4. Review that pipeline’s source commit and start its manual create_release_tag job. It rejects an existing tag and a tag that differs from the app version.

  5. The pipeline builds/signs the AAB and publishes it and fastlane/metadata/android/en-US/changelogs/4.txt to Internal and Alpha testing.

  6. Review the testing build before any separate production promotion.

Tag pipelines are disabled by the app workflow; creating the release tag does not create a second release pipeline. Listing/artwork synchronization and production promotion are not part of this preparation.

Local validation, 2026-11-06

  • The release check accepted v0.4 and rejected v0.3 for the 0.4 candidate. Its task now works with the configured Gradle configuration cache.

  • The app unit-test entry point exercised the shared JVM suite, and all 42 tests passed. All six shared JUnit XML reports were collected in the app CI report directory. Debug app/test builds and lint passed with zero lint errors.

  • Signed Release APK and AAB built and passed signature checks. The APK signing certificate matches the previously installed production 0.3 APK.

  • All 21 packaged arm64/x86_64 native libraries in each artifact passed the 16 KB ELF alignment check; APK ZIP alignment passed too. The NDK r27 Whisper integration applies both alignment linker flags to its GGML dependencies, following Android guidance. This is artifact validation, not a claim of execution on a 16 KB kernel.

  • Fresh signed release smoke passed on Medium_Phone_API_35, Android API 35, x86_64, in a read-only/no-snapshot session. Package dev.sysout.inmyhead, version 0.4/code 4, cold launch Status: ok (4,632 ms), running process verified. The original AVD and physical phone were not changed.

  • Five isolated Android checks passed on that read-only emulator: actual-driver migration/rollback, finalized WAV/prefix recovery, and loading the native worker-pool build. They used temporary fixtures, not user recordings.

  • Adapter-only configuration, shared input names/regexes, matching immutable refs, Internal-only destination, and the 319-character Play changelog passed local contract checks against the fetched shared revision. Hosted CI lint and hosted execution have not been validated for this candidate.

Ignored evidence is retained under tmp/release-0.4-20261106/. Runtime data, recording backups, attached screenshots, local signing files, and credentials are excluded from the release commit.