docs: close STEP-060C Maven Local validation

This commit is contained in:
OpenAI Codex
2026-09-07 22:28:13 +08:00
parent 9e0666c7c2
commit 9a38271cee
6 changed files with 62 additions and 40 deletions

View File

@@ -19,4 +19,4 @@ Starting HEAD:`80f360be7849be3e63557c4e074ee3a0fc02e15f`,分支 `particle/ma
未执行 Android Gradle、AAR build/publish、Expo prebuild、APK/ADB/设备或 Jest。用户必须先在 Gate C 环境完成 current HEAD AAR build → Maven Local publication → clean prebuild → Test Host Android compile/install → Phase A/B/lifecycle 验收,之后才可进入 STEP-061。
## STEP-060C 后续记录(2026-09-07)
Gate C 已生成当前 custom OpenGL AAR,但精确 Maven Local publication 曾在 Vanniktech `signAllPublications()` 要求 signatory 时失败。该问题只属于 Maven Local handoff,并不要求重建已核对的 AAR。STEP-060C 将签名 required 条件隔离为 Maven Central task graph;Local 保持正式坐标并可在没有 PGP signatory 时发布,Central 正式路径仍要求签名。后续执行结果由 STEP-060C 人工验收记录确认。
Gate C 已生成当前 custom OpenGL AAR,但精确 Maven Local publication 曾在 Vanniktech `signAllPublications()` 要求 signatory 时失败。该问题只属于 Maven Local handoff,并不要求重建已核对的 AAR。STEP-060C 将签名 required 条件隔离为 Maven Central task graph;Local 保持正式坐标并可在没有 PGP signatory 时发布,Central 正式路径仍要求签名。2026-09-07 人工执行已通过(sign task `SKIPPED`、publication `BUILD SUCCESSFUL`);最终 Local/build-output AAR SHA 为 `2e73e25cfd31bb181f75ba2d84974afb949640f72de46bc0234d4579abe3ba38`。这只关闭 Maven Local handoff,不代表 RN Test Host Android 验收完成。

View File

@@ -11,20 +11,25 @@
- 因而 Maven Local 的 Sign task 可正常跳过,不读取 signatory;Central task graph 仍会执行且要求签名。
- 未改变 AAR、artifactId、version、publication 名称、custom repository 来源或 RN bridge。
## 当前 AAR 证据
## 人工 Maven Local 验收(2026-09-07)
Gate C 已提供当前 OpenGL Release AAR:
用户在 Gate C 封存 Linux 环境实际执行:
- 路径:`platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-opengl-release.aar`
- mtime:`2026-09-07 21:26:46.463556571 +0800`
- size:`166262400`
- SHA-256:`47646fb708d096cf5ee0c3b8eeaeb7e6083081279c79f4a642db554efe88fad7`
- `classes.jar` 已含 `org/maplibre/android/maps/MapLibreMap.class`、`org/maplibre/android/maps/WeatherRuntime.class`。
```bash
cd /mnt/sda1/MapLibreParticleLab/platform/android
./gradlew :MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal --console=plain
```
本 Step 只改 Maven publication signing 条件;上述已核对 AAR 不需重建。
- `:MapLibreAndroid:signOpenglreleasePublication SKIPPED`;未出现 `no configured signatory`。
- `:MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal` 完成,`BUILD SUCCESSFUL in 3m 33s`(57 actionable tasks:49 executed、8 up-to-date)。
- Maven Local 已有 AAR、POM、module metadata,坐标为 `org.maplibre.gl:android-sdk-opengl:13.4.1`;没有 `.asc`,符合 Local publication 不签名的设计。
- 发布 AAR 与 `platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-opengl-release.aar` SHA-256 一致,均为 `2e73e25cfd31bb181f75ba2d84974afb949640f72de46bc0234d4579abe3ba38`。
- AAR `classes.jar` 含 `org/maplibre/android/maps/MapLibreMap.class`、`org/maplibre/android/maps/WeatherRuntime.class`,并含 `arm64-v8a`、`armeabi-v7a`、`x86`、`x86_64` 四 ABI。
`47646fb708d096cf5ee0c3b8eeaeb7e6083081279c79f4a642db554efe88fad7` 是 publication 前曾核对的中间 AAR SHA;publication 重新执行 `bundleOpenglReleaseAar` 后已由上述最终 SHA 取代,不得再作为当前 Maven Local artifact 引用。
## 验证与状态
- 已作静态 API/源码审计以及 `git diff --check`;未运行 Gradle、AAR build、Maven publish、APK、ADB、prebuild 或 Jest。
- 用户仍须在 Gate C 环境执行精确 Maven Local task,核对 Local 坐标目录中的 AAR SHA-256、POM 与 module metadata,并确认无 signatory 错误。
- 状态:`IMPLEMENTED / WAITING_USER_MAVEN_LOCAL_PUBLICATION_VALIDATION`,尚未进入 Android 综合验收或 STEP-061。
- 已完成:Maven Local signing isolation、Local publication、AAR/POM/module 存在与坐标核对、build output 与 Local AAR SHA 一致、两项 Host class 与四 ABI 核对。
- 未完成:RN Test Host Android compile/install、STEP-060 Phase A/B、style reload/map remount/stale reactTag/detach lifecycle、Binary Field 与 STEP-061;这些均不属于本 Step 的 PASS 范围。
- 状态:`CLOSED / PASS`(仅限上述 Maven Local signing isolation 与 publication 验收)。

View File

@@ -4,14 +4,13 @@
1. 确认当前为 `particle/main`,并记录 `git rev-parse HEAD`。Gate C 封存 Linux 环境是 custom MapLibre Native AAR 的构建环境;不要为 Test Host 生成工程的版本修改它。
2. 移走或清理 `~/.m2/repository/org/maplibre/gl/android-sdk-opengl/13.4.1/` 的旧 artifact,避免同坐标 provenance 混淆。2026-08-29 旧 AAR 的 SHA-256 是 `5c67d2751fafe211a0df4b82deded09ab1c07cf6ca0f4a12a880283287f85e5c`,只能作为 Gate C 历史证据。
3. Gate C 已于 2026-09-07 为当前基线生成 OpenGL Release AAR;若下列 SHA-256 与 classes 核对通过,**不要为 STEP-060C 重新构建**:`platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-opengl-release.aar`,SHA-256 `47646fb708d096cf5ee0c3b8eeaeb7e6083081279c79f4a642db554efe88fad7`,其中必须有 `org/maplibre/android/maps/WeatherRuntime.class` 与 `MapLibreMap.class`。仅当 checkout 已改变或该核对失败时,才在 Gate C 封存 Linux 环境执行 `cd platform/android && RENDERER=opengl BUILDTYPE=Release make apackage`。
4. 使用源码定义的精确 publication task 发布:`cd platform/android && ./gradlew :MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal --console=plain`。STEP-060C 使 Maven Local 的 sign task 在无 signatory 时跳过;不得使用 `-x sign`、不得改坐标或创建 SNAPSHOT。Maven Central 正式 publication 仍要求签名。
5. 核对 Maven Local 出现 `org/maplibre/gl/android-sdk-opengl/13.4.1/`,其中 AAR SHA-256 仍为上述当前 Gate C 值,并同时有 POM 与 module metadata;它们必须来自当前构建,不能是 2026-08-29 的旧 AAR。
6. `cd integration/react-native/MapLibreParticleRNTestHost && npm ci && npx expo prebuild --platform android --clean`。`package-lock.json` 已在无 `--legacy-peer-deps` 的 npm 安装下通过;不要改用 Yarn 或生成 `yarn.lock`。本次 plugin 变更后必须 clean prebuild。
7. 检查生成 root Gradle 有 `MapLibreParticleRNTestHost custom OpenGL SDK`、`nativeVersion=13.4.1`、`nativeVariant=opengl`;Maven Central 必须排除精确 custom module `org.maplibre.gl:android-sdk-opengl`,使该 AAR 缺失时失败而非 fallback。MLRN 的 turf/annotation/scalebar 不是 custom SDK,不应被这个模块级排除误伤。
8. 首次 prebuild 后实际记录 Test Host 的 Gradle wrapper、AGP、Kotlin plugin、min/compile/targetSdk、NDK、JDK、Hermes 与 New Architecture。当前观察到的 `9.3.1/8.12.0/2.1.20/24/36/36/27.1.12297006` 属于 Test Host 生成工程,不等于 Gate C 环境。
9. 再按实际生成工程编译/安装 Test Host。启动后确认单一地图正常加载;style ready 后应显示 reactTag 和 `WAITING_FOR_FIELDS`,不提交 field 时粒子/色场为空是预期。
10. 对同一 reactTag 依次验证 Phase A:getState、enable、WeatherColor visible、particle visible、FPS 30 均得到结构化 Native result。
11. 验证 Phase B:PLAY/PAUSE、HALF/NORMAL/DOUBLE、epoch-ms seek、stops、独立 particle/trail RGBA、count/line/length/opacity/fade/WeatherColor opacity。不得出现 JS `PLAYING/PAUSED` 第二状态机。
12. 重载 style:旧 Runtime 必须 disposed;style ready attach 的新 Runtime 正常工作。remount Map 后,用旧 reactTag 调用必须返回 `MAP_VIEW_NOT_FOUND`,不得命中新 Map。
13. 卸载 Host:确认 view detach dispose;无持续 Handler wake、无全局 current map。通过上述 Android 验收后才进入 STEP-061;此前不要尝试 number[]、JSON/base64 大 field。
3. STEP-060C Maven Local 已于 2026-09-07 人工验收通过:`signOpenglreleasePublication SKIPPED`,精确 publication task `BUILD SUCCESSFUL in 3m 33s`,没有 `no configured signatory`。Maven Local 的 `org/maplibre/gl/android-sdk-opengl/13.4.1/` 已含 AAR、POM、module metadata,且没有 `.asc`;Maven Central 正式 publication 仍要求签名。
4. 当前已发布 AAR 与 build output AAR SHA-256 均为 `2e73e25cfd31bb181f75ba2d84974afb949640f72de46bc0234d4579abe3ba38`,并含 `WeatherRuntime.class`、`MapLibreMap.class` 与四 ABI。`47646fb…` 仅是 publication 前中间 AAR SHA,不是当前 artifact。后续只有 checkout 或 AAR 变化时,才在 Gate C 重新 build/publish 并重新核对 provenance。
5. `cd integration/react-native/MapLibreParticleRNTestHost && npm ci && npx expo prebuild --platform android --clean`。`package-lock.json` 已在无 `--legacy-peer-deps` 的 npm 安装下通过;不要改用 Yarn 或生成 `yarn.lock`。本次 plugin 变更后必须 clean prebuild。
6. 检查生成 root Gradle 有 `MapLibreParticleRNTestHost custom OpenGL SDK`、`nativeVersion=13.4.1`、`nativeVariant=opengl`;Maven Central 必须排除精确 custom module `org.maplibre.gl:android-sdk-opengl`,使该 AAR 缺失时失败而非 fallback。MLRN 的 turf/annotation/scalebar 不是 custom SDK,不应被这个模块级排除误伤。
7. 首次 prebuild 后实际记录 Test Host 的 Gradle wrapper、AGP、Kotlin plugin、min/compile/targetSdk、NDK、JDK、Hermes 与 New Architecture。当前观察到的 `9.3.1/8.12.0/2.1.20/24/36/36/27.1.12297006` 属于 Test Host 生成工程,不等于 Gate C 环境。
8. 再按实际生成工程编译/安装 Test Host。启动后确认单一地图正常加载;style ready 后应显示 reactTag 和 `WAITING_FOR_FIELDS`,不提交 field 时粒子/色场为空是预期。
9. 对同一 reactTag 依次验证 Phase A:getState、enable、WeatherColor visible、particle visible、FPS 30 均得到结构化 Native result。
10. 验证 Phase B:PLAY/PAUSE、HALF/NORMAL/DOUBLE、epoch-ms seek、stops、独立 particle/trail RGBA、count/line/length/opacity/fade/WeatherColor opacity。不得出现 JS `PLAYING/PAUSED` 第二状态机。
11. 重载 style:旧 Runtime 必须 disposed;style ready attach 的新 Runtime 正常工作。remount Map 后,用旧 reactTag 调用必须返回 `MAP_VIEW_NOT_FOUND`,不得命中新 Map。
12. 卸载 Host:确认 view detach dispose;无持续 Handler wake、无全局 current map。通过上述 Android 验收后才进入 STEP-061;此前不要尝试 number[]、JSON/base64 大 field。

View File

@@ -2,7 +2,7 @@
## 结论
已完成源码层的 Maven Local 签名隔离,状态为 `IMPLEMENTED / WAITING_USER_MAVEN_LOCAL_PUBLICATION_VALIDATION`。本报告不宣称 Maven Local publication 已由 Codex 实际运行或 Android 验收通过。
STEP-060C 已为 `CLOSED / PASS`:用户于 2026-09-07 在 Gate C 封存 Linux 环境完成 Maven Local publication,Local 签名隔离按设计生效。本 PASS 仅覆盖 Maven Local signing isolation、发布与 artifact provenance;不代表 RN Test Host Android compile、STEP-060 Phase A/B、lifecycle、Binary Field 或 STEP-061 通过。
## 实际修改
@@ -30,28 +30,40 @@
| Central 签名 | `*PublicationToMavenCentralRepository` task graph 中仍 required |
| AAR 来源 | Gate C 已验证的 custom OpenGL AAR;无 flatDir、files repo、第二仓库或 SNAPSHOT |
## 已执行验证
## 人工 Maven Local 验收(2026-09-07)
- 静态读取 Vanniktech `gradle-maven-publish-plugin:0.34.0`:`signAllPublications()` 对 release 设置 `SigningExtension.required`;Gradle SigningExtension 的 `setRequired(Object)` 支持 deferred Provider,并在 Sign task 执行时解析。
- 静态审计 publication 名称、artifactId、version 与 Central task 名称约束。
- `git diff --check`(结果见提交前最终核验)。
## 未执行项目
按任务限制,未执行 Android Gradle、AAR build、Maven Local publish、Expo prebuild、APK、ADB、Android 设备/虚拟机测试或 Jest。
## 已知剩余风险与人工验收
唯一关键剩余验证是用户在 Gate C 封存 Linux 环境实际运行:
用户执行:
```bash
cd /mnt/sda1/MapLibreParticleLab/platform/android
./gradlew :MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal --console=plain
```
随后确认 `~/.m2/repository/org/maplibre/gl/android-sdk-opengl/13.4.1/` 存在 AAR、POM、module metadata,AAR SHA-256 为 `47646fb708d096cf5ee0c3b8eeaeb7e6083081279c79f4a642db554efe88fad7`,且输出没有 signatory failure。仅在此通过后,才继续 RN Test Host 的 clean prebuild 与 Android 综合验收。
- 已完成:`:MapLibreAndroid:signOpenglreleasePublication SKIPPED`;`:MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal` 通过;`BUILD SUCCESSFUL in 3m 33s`(57 actionable tasks:49 executed、8 up-to-date);输出不含 `no configured signatory`。
- 已完成:`~/.m2/repository/org/maplibre/gl/android-sdk-opengl/13.4.1/` 含 AAR、POM、module metadata;POM/module 坐标为 `org.maplibre.gl:android-sdk-opengl:13.4.1`。
- 已完成:Maven Local AAR 与 `platform/android/MapLibreAndroid/build/outputs/aar/MapLibreAndroid-opengl-release.aar` SHA-256 同为 `2e73e25cfd31bb181f75ba2d84974afb949640f72de46bc0234d4579abe3ba38`。
- 已完成:AAR `classes.jar` 有 `org/maplibre/android/maps/MapLibreMap.class`、`org/maplibre/android/maps/WeatherRuntime.class`;AAR 有 `arm64-v8a`、`armeabi-v7a`、`x86`、`x86_64` 四 ABI;Maven Local 不含 `.asc`,符合 Local publication 不签名的设计。
- 历史说明:`47646fb708d096cf5ee0c3b8eeaeb7e6083081279c79f4a642db554efe88fad7` 为 publication 前中间 AAR SHA;Gradle 重新执行 `bundleOpenglReleaseAar` 后,它不是当前 published artifact。
## Codex 静态核验
- 静态读取 Vanniktech `gradle-maven-publish-plugin:0.34.0`:`signAllPublications()` 对 release 设置 `SigningExtension.required`;Gradle SigningExtension 的 `setRequired(Object)` 支持 deferred Provider,并在 Sign task 执行时解析。
- 静态审计 publication 名称、artifactId、version 与 Central task 名称约束。
- 只读核对 Local/build output AAR SHA、POM/module 坐标、classes、ABI 与 `.asc` 缺失;`git diff --check` 将在本次 docs-only commit 前再次执行。
## 未执行 / 无法验证
- 未执行:本轮 Codex 未运行 Android Gradle、AAR build、Maven publish、Expo prebuild、APK、ADB、Android 设备/虚拟机测试或 Jest;publication 结果为用户提供的人工实测证据。
- 未完成:RN Test Host `npm ci`、clean Expo prebuild、generated Gradle resolution、Android compile/install、STEP-060 Phase A/B、style reload/map remount/stale reactTag/detach lifecycle;任务明确留给下一轮 STEP-060 Android 人工验收。
- 无法验证:本轮没有设备/模拟器与 RN 生成工程执行授权,故不对上述 Android/RN 结果作 PASS 推断。
## 已知剩余风险与下一步
下一阶段仍是 STEP-060 RN Test Host Android 验收:`npm ci`、clean Expo prebuild、检查 generated Gradle 的 Maven Local/custom SDK resolution、用户手工 Android compile/install、Phase A/B 与 lifecycle 验收。通过后才可进入 STEP-061。
## 提交与推送
- 功能提交:`5f0804e8ba3a8a6fed1fff09ddd92a76a77bd458` — `fix: isolate Maven Local from release signing`
- 文档提交、最终 HEAD 与远端结果将在本报告提交后补充。
- 初始文档提交:`9e0666c7c284d5080ebd2e711f46928f788ddcec` — `docs: record STEP-060C local publish signing fix`
- 本次人工验收文档收尾 Starting HEAD:`9e0666c7c284d5080ebd2e711f46928f788ddcec`。
- 本次 docs-only commit SHA/message、Final HEAD、Remote HEAD 与 push 结果将在收尾 commit 生成后,以最终回填为准。