Skip to content

Prepare LeanTypeDual 2.0.0 signed release candidates - #157

Draft
AsafMah wants to merge 1 commit into
v2from
user/asafmahlev/leantypedual-2-0-release
Draft

AsafMah wants to merge 1 commit into
v2from
user/asafmahlev/leantypedual-2-0-release

Conversation

@AsafMah

@AsafMah AsafMah commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Scope

Release preparation from merged v2, not old main. Builds on #156 / merge 375cabb19f0d1d3adf3b78eeb0e1361d37b56cc0. This PR does not authorize merging, tagging, or publishing.

  • Replace inherited build-release-apk.yml with the registered fork release.yml, using the existing four signing secrets and exactly standard, standardfull, and offline.
  • Missing signing secrets fail closed; native/R8 release builds, exact artifact counts, signature verification (including legacy v1), and R8 mapping checks precede uploads. Signing material is removed. Manual dispatch only uploads candidates; version-tag runs create drafts only, in a separately permissioned job.
  • Validate prepared notes against Gradle and actual tag refs. Branch v2 is not a version tag; missing, wrong-version, empty, header/comment-only, and known placeholder-only notes fail.
  • Stage 2.0.0 notes, fastlane changelog 6000.txt, dated preparation changelog plus fresh Unreleased, and the release runbook. Document the clean reset onto LeanBitLab/LeanType 2a9d5fecb, opt-in editable row-aligned swipe shortcuts, number-row behavior, cancellation/timer fixes, three flavors, and the absence of old-fork feature-parity/settings-migration guarantees.

No app version/SDK or other production source changes were needed: versionName 2.0.0, versionCode 6000 were already correct.

Exact signed candidate

Commit: 726552ed426e98e2a0524469fc6ca13aa2c1f036
Successful manual run: https://github.com/AsafMah/LeanType/actions/runs/34942348417

The run's head SHA matches this PR's candidate. No follow-up commits or binary changes were made after that build. Native ARMv7/ARM64 builds, R8 minification and resource optimization executed successfully for all three release flavors. The draft job was skipped, as required for workflow_dispatch.

Download the release-apks artifact from the run for three signed APKs, SHA256SUMS.txt, release_notes.md, and commit.txt. release-verification contains CI signer reports and all three R8 mappings.

Flavor Package Version / code Declared min / target SDK APK bytes
standard com.asafmah.leantypedual 2.0.0 / 6000 23 / 35 10,919,516
standardfull com.asafmah.leantypedual 2.0.0 / 6000 23 / 35 10,919,574
offline com.asafmah.leantypedual.offline 2.0.0 / 6000 21 / 35 10,412,448

Independent local apksigner verify --verbose --print-certs passed on all three downloaded APKs (v1/v2/v3). Explicit legacy verification passed at SDK23 for standard/full and SDK21–23 for offline. aapt dump badging confirmed each package/version, LeanTypeDual label, ARMv7+ARM64, non-debuggable status, and intended Internet/install permissions. Checksums match CI.

Downloaded the corresponding published v0.3.0 APKs and verified their GitHub asset hashes, package identities and signatures separately. All three candidate signers match their published predecessor:

SHA-256 certificate: c032eafcd7ce9197fd9e636f2c86b1590f0a84f8f73016c66d63c1382af81554

Version code increases from 4300 to 6000. Standard/full still share one package; offline retains .offline. Old offline declared SDK26; the new upstream-derived offline declaration is SDK21. Certificate compatibility does not prove settings migration or runtime support on a lower SDK.

6e9e232363afda129df8983df8d800ea9ae26779014dd63a7b6950ada084cbf8  1-LeanTypeDual_2.0.0-standard-release.apk
c35939e9b507da626d19933c4462861571e6362bbbd4e70e3dd37eae94bb1ec1  1-LeanTypeDual_2.0.0-standardfull-release.apk
c33c5e770313b84308182c8fd98dc12a2e0d468f3856bc1fa15eaf9d8205f017  2-LeanTypeDual_2.0.0-offline-release.apk

Validation and limits

  • 17 isolated Python CLI regression tests pass locally and in CI; actionlint passes.
  • 62 focused standard-debug JVM tests pass (54 real-arbiter swipe cases, 3 settings, 5 identity), with a session-local init script disabling JNI and selecting locally installed build-tools36. These JVM outputs are not release APKs.
  • Actual workflow shell gates exercised with synthetic inputs: each absent secret fails; missing/extra APKs, missing R8 mapping, and signer/legacy-signer failures fail despite tee. Java Properties.load round-trip checked spaces, escapes, and supplementary Unicode without accessing real secrets.
  • Independent review findings on placeholder bodies and Java properties escaping were fixed before the candidate commit.
  • Local offline unit-test manifest merging failed on its SDK21 / graphics-path SDK23 conflict. The production manifest already has an upstream override; the real offline release build and signature/manifest checks succeeded. Production SDK configuration was not changed. This is not evidence of SDK21 runtime compatibility.

Required before public release

  • Test the actual minified signed candidate on devices: ordinary typing, enable/edit swipe menus, number row, cancellation/timers, and upgrades from 0.3.0 for retained packages.
  • Verify offline behavior on its declared lowest SDK, or make a separately approved support decision. API21 runtime support is unverified.
  • Maintainer explicitly approves merging this preparation PR into v2.
  • After device results and approval, explicitly approve the final version tag; review the resulting draft and separately approve public publication.

No final tag, release, or merge was created by this preparation.

Replace the inherited release workflow with the fork signing identity and three-flavor draft-only pipeline. Validate release notes against Gradle and tags, and document the clean-reset release and approval boundary.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant