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.ymlruns 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.ymlprovides the protected-main manual tag gate and signed AAB build. -
publish.ymluploads that pipeline’s signed AAB and version-specific notes to Internal testing and the shared default additional Alpha (Closed testing) track. The app adapter inheritsadditional_play_tracksfrom 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
mainand intendedv*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_TOKENwithout 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, andANDROID_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
-
Verify GitLab model-core resolution and the protected setup prerequisites.
-
Push the prepared branch and let normal verification pass, then review/merge through the normal project workflow.
-
From protected
main, start a web pipeline withRELEASE_TAG=v0.4. -
Review that pipeline’s source commit and start its manual
create_release_tagjob. It rejects an existing tag and a tag that differs from the app version. -
The pipeline builds/signs the AAB and publishes it and
fastlane/metadata/android/en-US/changelogs/4.txtto Internal and Alpha testing. -
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.4and rejectedv0.3for 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. Packagedev.sysout.inmyhead, version0.4/code4, cold launchStatus: 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.