Skip to content

[AND.40] PR B: retire Kotlin, KMP and Gradle; publish the MAUI APK as android-VERSION - #25

Merged
deku2026 merged 15 commits into
mainfrom
task/and-40
Oct 9, 2026
Merged

deku2026 merged 15 commits into
mainfrom
task/and-40

Conversation

@deku2026

@deku2026 deku2026 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Claim: AND.40 epoch 1 (w-deku-20261009-and-40)

Task record: android lane, task-and-40. Authority:

  • P2-021 item 3: the Android companion is .NET MAUI for net10.0-android only, with Mono AOT for release (not NativeAOT);
  • the planning repairs fix4 and fix5;
  • the coordinator's AND.40 decisions 1 to 22 and S20(g), S25 and S26.

This is PR B of two (decision 5). PR A (#24, merged as 43ecb25) published the MAUI prerelease android-maui-0.1.0-ci.74.1 (main CI 37937976324). That release stays as immutable history.

What this changes (unit 6)

  • CI: the Kotlin build and publish jobs and the java-kotlin CodeQL job are retired. actionlint moves to a Linux workflow-lint job, and verify requires maui, security and workflow-lint. The MAUI publish is now publish, with tag android-VERSION and title "Android VERSION (.NET MAUI)". Secret handling, the android-release environment and the signing steps are unchanged.
  • Dependabot: moves from the gradle ecosystem to nuget, with the maui, contracts and tests groups.
  • Retirement:
    • the Kotlin app (app/**), the KMP shared/** module, the Gradle build, wrapper and settings, .java-version and eng/licences.gradle.kts are deleted;
    • so are the Kotlin candidate, signing, device-smoke, resource and build-identity paths in eng, and the Gradle licence closure and dependency admission.
  • Re-homed checks: eng/maui_identity.py check_dependency_policy covers the exact publisher binding, the publish-job conditions, review-set equality (reviews plus retiredReviews) and git-history immutability of retained reviews, with negative tests.
  • Records:
    • android-kotlin-retirement-r1: its sourcePaths are exactly the 52 deleted paths, and android-packaged-resources-r14 is retired with a bounded retired inventory field;
    • contracts-build-identity-r3: AppVersion is now the allocated release name under com.arcforges.mobile, with no synthetic source;
    • contracts-provenance-port-r3;
    • no existing record, profile, review or tag is rewritten.
  • Docs: current-state README and docs (SDK 10.0.400, workload set 10.0.401, MAUI 10.0.20, min API 26, com.arcforges.mobile), the PR checklist and the bug template.

Validation

Local B gate at 1eabc64, run by the independent reviewer through the workstation build slot: B GATES PASSED.

  • Locked restores into a clean NUGET_PACKAGES, and Debug and Release net10.0-android builds (0 warnings).
  • Policy tests 67/67 and host tests 132/132.
  • zipalign 16 KB, the notice closure and reproof, check_provenance, maui-stage, and the identity of both APKs.
  • eng tests 176/176, also under CI variables, and the mobile check.
  • actionlint 1.7.12 clean.

Not run locally

The hosted-only steps: Linux linux-evidence and maui-stage, codeql-csharp, and Verify at this head.

Carried (S26 and review notes)

  • The Gradle-era workflow-bytes review binding lapses. The NuGet lock admission binding stays enforced.
  • The publish-condition check uses substring matching.
  • The workloadSet review field form.
  • Adding a pinned setup-java to the publish job is a separate signing-job change.

🤖 Generated with Claude Code

deku2026 and others added 15 commits October 9, 2026 14:38
…L jobs

The Kotlin build and publish jobs and the codeql-kotlin job leave the workflows. The actionlint step moves to a Linux workflow-lint job that verify requires with maui and security. The MAUI jobs and the csharp CodeQL job are unchanged.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
The gradle block is replaced by a nuget block over the six explicit Mobile project directories, weekly on Mondays, with maui, contracts and tests groups. The github-actions block is unchanged. The dependency policy now states the NuGet update procedure: an admission record, a locked restore into a clean NUGET_PACKAGES folder, and no auto-merge.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
The publish-maui job becomes publish and creates the android-VERSION prerelease titled "Android VERSION (.NET MAUI)". The release tag, the eng tag, the published.py tag and the maui-prepare default candidate follow the same namespace. The PR A android-maui-VERSION releases stay as published history. The release.json track stays maui.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…paths from eng

mobile.py keeps version, check, hooks, maui-stage and maui-sign, and its defaults point at the MAUI candidate and release directories. The Kotlin bytecode, stage, verify and sign paths and their helpers are removed, and repository_check no longer runs the Gradle project audit, the Gradle dependency policy or the Kotlin profile history. published.py keeps only the MAUI verification and maui-prepare. device-smoke.py and verify_published_fixture.py are removed with their inventory rows. The Kotlin cases of test_mobile.py are removed.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…sion gates

licences.py keeps the .NET project audit (now dotnet_project_audit, run by the repository check) and the MAUI closure audit. The Gradle roster, the lock and verification-metadata checks, the Kotlin closure and distribution verification, and the Gradle declarations are removed. dependency_policy.py and its tests are removed; the NuGet feed, Contracts packages and reviews list in dependency-policy.json now describe the MAUI closure, and the Kotlin reviews stay on disk as history. licence-boundary.json keeps its schema with an empty roster, which maui_identity now requires. The three retired Gradle build files stay exempt from the build-system check until unit 8 deletes them.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
resources.py keeps the shared JSON helpers and the MAUI archive gate. The Kotlin archive verification, the resource profile, the source receipt and the signing payload are removed with their tests. build_identity.py keeps the MAUI report only: the generate, report and verify_report Kotlin paths and the Gradle-lock source of PackageVersion are removed, and PackageVersion is derived from the MAUI NuGet lock. The reviewed Contracts source text that the MAUI ContractSet axis binds moves, byte for byte, to eng/policy/contracts-source.json with its digest pinned in build_identity.py. contracts-build-identity-r3 supersedes r2 for the two changed Contracts-derived files, named to the AND.40 reviewer. The Kotlin artifact record android-packaged-resources-r14 remains tracked and is retired with the notice texts in the next unit.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…y and artifact binding

The android-licences inventory and the eight notice texts that only the Kotlin closure used are removed, and their inventory rows go with them. The Kotlin artifact record android-packaged-resources-r14 retires through a new explicit retired-artifact status in check_provenance: it stays tracked and unchanged, it is exempt from notice and profile binding, and only an artifact active in the previous inventory may retire. Two Contracts-derived tools that changed are rebound to successor records (contracts-provenance-port-r3 supersedes r2, reviewed by the AND.40 reviewer). The retained notices, the MAUI notice block and the MAUI closure notices are unchanged. THIRD_PARTY_NOTICES.md keeps only the MAUI block and a current preamble.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
The 37 tracked paths of the Kotlin baseline are removed: app/, shared/ and gradle/ (29 files), the root Gradle build, settings, lockfile, properties, wrapper scripts, .java-version and eng/licences.gradle.kts. Their inventory rows go with them; the Gradle wrapper record gradle-wrapper-9-7-1-r2 becomes inactive and stays unchanged as history. The temporary exemption of the three retired Gradle build files is removed, so any build system file other than a reviewed .csproj is refused again. The Kotlin release tags, assets and immutable records are not touched.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…ainst the maui job

The JDK pin that .java-version carried is recorded in eng/policy/dotnet-toolchain.json as Temurin 21.0.12 for Android platform tooling only. maui_identity checks that the maui job of ci.yml pins the same version and that .java-version is gone, with a refusal test.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
README, CONTRIBUTING, AGENTS, the development, licence, provenance, build-identity, releasing and toolchain docs describe the .NET MAUI application, the APK-only release under android-VERSION, the NuGet dependency procedure and the retirement of the Kotlin application, its Gradle build, its CodeQL category and its installed-package identity. Dated bootstrap and planning records keep their history with a note. .gitignore drops the Gradle and Kotlin rules and ignores only the MAUI /build/ output; .gitattributes drops the gradlew, *.bat and *.jar rules that no tracked file needs.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…ment receipt

android-kotlin-retirement-r1 is a successor record in the existing schema with disposition Drop: its sourcePaths list the 52 tracked paths this pull request removes since the PR base, and its verification and review text name the retired consumers (the Kotlin application and KMP module, the Gradle build and locks, the Gradle licence closure, the Kotlin device smoke and upgrade helpers, the Maven feed, the java-kotlin CodeQL category and bundle, the Kotlin publish job and release namespace, the io.github applicationId, the Kotlin upgrade baseline and the retired artifact record android-packaged-resources-r14). The earlier records stay unchanged as history. The record names the AND.40 reviewer. No MAUI device upgrade proof exists until PRF.12 and AND.13.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…rect the build identity record and the PR checklist

AppVersion no longer reads release/app.json, an untracked file that synthesised the retired io.github.arcforges.mobile subject into build-identity.json, which every APK embeds. The release axis is the allocated release name under the MAUI artifact id com.arcforges.mobile, recorded with no source path. The catalog entry is {kind release, allocation release-name}; any source file on that axis is refused. contracts-build-identity-r3 is corrected to the new target digests and records the correction. The pull request checklist names the current gates instead of the Kotlin checks and Gradle checksum metadata.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…lchain record

The maui job installs android and maui-android at the explicit workload set 10.0.401 and checks for "Workload version: 10.0.401" (AND.40 decision 22). The record described an unversioned install and said PR A still adds the channel beside the Gradle baseline, which PR B retires.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…tired review chain

The retired eng/dependency_policy.py enforced the publisher binding, the dropped-review
set equality and the immutability of retained dependency reviews. Those checks are now
in eng/maui_identity.py check_dependency_policy, run by check_maui:

- the policy publisher is exact and the publish job of ci.yml carries the
  android-release environment, refs/heads/main and the push event;
- every review file is listed exactly once, in reviews or retiredReviews;
- in a git checkout, no review ever added to history is deleted, and no retained review
  differs from its first addition (a successor review supersedes it).

eng/policy/dependency-policy.json lists the 16 Gradle, Kotlin and Compose/Spotless
reviews as retiredReviews, an explicit recorded removal from the ordered MAUI chain.
docs/dependency-policy.md now describes only enforced checks; the content of a review
remains a human review obligation.

The three provenance records added by this PR (android-kotlin-retirement-r1,
contracts-build-identity-r3, contracts-provenance-port-r3) no longer pre-assert the
reviewer's decision: review.decision is pending and reviewedOn is null until the
reviewer records its own outcome. check_provenance refuses them until then. The
records that already exist at the base commit are unchanged.

Negative fixtures cover a wrong publisher, a publish job without its environment, a
dropped review, a deleted review and a rewritten review; a successor review is accepted.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…omment and the bug template

- The three records this PR adds (android-kotlin-retirement-r1, contracts-build-identity-r3,
  contracts-provenance-port-r3) name the pre-assigned reviewer w-deku-20261008-rev-and-40,
  decision approved and reviewedOn 2026-10-09 (brief S25). The rationale of the retirement
  receipt calls out the bounded retired field of eng/provenance/files.json.
- eng/published.py: the comment states that this module verifies android-VERSION tags only.
  The PR A prerelease android-maui-0.1.0-ci.74.1 was verified by its own publish run (main CI
  37937976324) and is kept as immutable history.
- .github/ISSUE_TEMPLATE/bug_report.yml asks for the app version and the Android version or OS
  instead of the JDK.
- Three test methods that named the retired Kotlin baseline are renamed for what they assert
  now; their assertions are unchanged.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@deku2026

deku2026 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author

Reviewed 1eabc64 for [AND.40] epoch 1: approved (independent exact-head review; PR B rounds 1 to 4).

Reviewer: independent session w-deku-20261008-rev-and-40. Approvals are comments under one GitHub account, so independence is by session only.

Material findings, rounds 1 to 3, all resolved at this head:

  • r1 (at 0dda214): the build identity still carried the retired io.github.arcforges.mobile subject through release/app.json, and the PR checklist was stale. Fixed in 5692872.
  • r2 (at 5692872): the workload pin was misstated in docs/maui-toolchain.md. Fixed in 3d3fa21.
  • r3 (at 3d3fa21):
    • (1) the deleted eng/dependency_policy.py checks were re-homed in maui_identity.check_dependency_policy, with tests (983eb13);
    • (2) the records naming the reviewer follow coordinator ruling S25 (1eabc64).

Round 4 (this head):

  • B gate, run by the reviewer through the build slot: B GATES PASSED.
    • Locked restores into a clean NUGET_PACKAGES. One NuGet timeout was retried and the restore then completed locked.
    • Debug and Release builds with 0 warnings.
    • Policy tests 67, host tests 132, zipalign 16 KB, the notice closure and checks, check_provenance, maui-stage of candidate 0.1.0-ci.1.1 from this head, and the identity of both APKs.
    • eng tests 176 OK, also under CI variables, and the mobile check. The worktree was clean afterwards.
  • actionlint 1.7.12: clean on ci.yml and security.yml.
  • Records: android-kotlin-retirement-r1 sourcePaths equal the 52 deleted paths. The contracts-build-identity-r3 and contracts-provenance-port-r3 targets and evidence hashes were verified against the tree and Contracts e8b3e12 and aa2f187. All three are approved with reviewedOn 2026-10-09. No record already on main is rewritten.
  • PR A history: release android-maui-0.1.0-ci.74.1 exists at 43ecb25, and run 37937976324 succeeded.

Non-blocking findings, carried:

  • The Gradle-era workflow-bytes review binding is not re-homed. It is disclosed, and the NuGet lock admission stays enforced (S26).
  • The publish-condition check uses substring matching.
  • The workloadSet review field form.
  • A .gitignore header.
  • Hosted-only steps are not observed locally; the merge waits for hosted Verify at this head.

@deku2026
deku2026 merged commit 6702e28 into main Oct 9, 2026
12 checks passed
@deku2026
deku2026 deleted the task/and-40 branch October 12, 2026 01:28
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