Skip to content

Release Checklist

The versioning, licence and release gate for a tagged release.

Status as of 2026-08-09: every technical item below is satisfied except CI (a policy decision, see below) and the licence. The licence is the single blocker on the release gate, and it is a rights-holders decision, not an engineering task.

Gate

  • [x] Parity gate green (make parity): enums/schemas match the Kotlin/C++ mirrors.
  • [x] Lint + typecheck clean (make lint, make typecheck).
  • [x] Host test gates green: Python make check, C++ (make test-cpp), Kotlin JVM (:MobileTransformers:testDebugUnitTest).
  • [x] AAR builds + publishes to mavenLocal and an external consumer app builds against it. Proven 2026-08-08: make publish-local && make consumer-app → a 105 MB APK carrying all 7 native libraries, resolved from mavenLocal alone (FAIL_ON_PROJECT_REPOS).
  • [x] Docs set complete for locked contracts; COMPATIBILITY_MATRIX.md regenerated (not stale).
  • [x] All version sites agree (pyproject == __version__ == Gradle version == CITATION.cff == the tiny_package fixture's mobiletransformersVersion == tag). Guarded by tests/unit/test_version_sites.py, so this cannot silently drift. The Gradle version lives in android/MobileTransformers/gradle.properties and is overridable with -Pversion=. The sample app's versionName now derives from that root property rather than being a literal — it read "1.0", which matched no other site in the repo and was the one version number a user actually sees.
  • [x] Model shelf publishedmake publish-catalog run, and every entry in the app's assets/model_catalog.json names a repo that actually holds a package. Needs HF_TOKEN_ORG in .env. Verify against the Hub API, not the script's own log: a push that half-succeeded and a push that worked print the same final line. See CATALOG.md. Done 2026-08-17: five repos, each carrying a mobiletransformers_manifest.json.
  • [x] A fresh clone can be provisionedmake doctor names every missing prerequisite with the command that fixes it, and make fetch-native-deps installs the gitignored Android natives against the sha256s in third_party/android/manifest.json. Done 2026-08-17: hosted in the public dataset repo mobiletransformers/build-artifacts and baseUrl set. Verified anonymously (env -u HF_TOKEN -u HF_TOKEN_ORG) from a tracked-files-only tree, for the natives, the training wheel and the debug symbols.
  • [x] CHANGELOG.md updated for the release; non-goals listed, and a Known issues section carries what a reader must not discover the hard way.
  • [ ] License finalized with SPDX headers on first-party source. BLOCKER — see below.
  • [ ] CI green: fastexport-smokeandroid-assemble (.github/workflows/ci.yml). Blocked on a policy decision, not on the code. All three workflows are workflow_dispatch-only: their automatic triggers were removed 2026-08-08 because they were not in use and the native-dependency provisioning question is unresolved. Until the on: blocks are restored (they are preserved in a comment at the top of each file), a green badge is not a gate — a release must record a manual run instead. See "Open decisions".

Device evidence

  • [x] train 1 step → merge → generate 1 token → ingest/query 1 RAG doc, with time/memory artifacts. Ran on a Galaxy S21 FE / Android 15 / arm64-v8a, 2026-08-08, via make device-packagemake device-test. device.yml has a real body but no registered self-hosted runner, so this evidence is produced by a manual run, not nightly CI.

The licence blocker

The project is CC-BY-NC-4.0, which is incompatible with the consumable-AAR goal: a non-commercial licence blocks the adoption the release is for. Relicensing is a decision for all rights holdersCITATION.cff lists Korelič and Pejović.

Nothing technical is waiting behind it. When agreement lands, the swap is four coordinated edits plus headers, and should go in as one reviewed commit:

Site Current Change
LICENSE.md full CC BY-NC 4.0 text replace with the chosen licence text
pyproject.toml (~:21) license deliberately omitted, with a comment naming the pending decision set the licence expression
android/MobileTransformers/MobileTransformers/build.gradle.kts (POM block) hard-codes CC BY-NC 4.0, with a comment requiring lockstep with LICENSE.md update to match
first-party source zero SPDX headers exist anywhere add SPDX-License-Identifier headers

Scope of the headers: first-party source only. Vendored Microsoft / tokenizers / protobuf code is untouched and is already enumerated in THIRD_PARTY_NOTICES.md, which is complete and current (redistributed-in-AAR, build/test-only, and Python dependency tables). Model weights keep their upstream licences regardless of this decision.

Open decisions blocking a v1.0 tag

  1. Licence — above. The only item the release gate genuinely waits on.
  2. CI triggers — restore push/pull_request on ci.yml, or keep workflows manual and accept that "CI green" means a recorded manual run. Either is defensible; the checklist must match whichever is chosen.
  3. CI native-dep provisioning — how jniLibs/aarLibs and the git-ignored cp312 ORT-training wheel reach a hosted runner (rebuild vs cached artifact vs private storage). android-assemble and ort-training-smoke self-skip without them today. Only worth answering if (2) restores triggers.