One-shot NTP app phases
android-apk / debug-apk (push) Failing after 2m21s

This commit is contained in:
2026-07-09 15:55:03 -08:00
parent bfb027fcd2
commit ff48fe2ef2
25 changed files with 768 additions and 53 deletions
@@ -0,0 +1,18 @@
# ADR 0003: Privileged install track
## Decision
Ordinary sideloading will not make NTP Check a privileged app. The main app remains a normal diagnostic app. A future separate privileged/root build track may be designed, but it must not be mixed into the default release.
## Notes
A privileged Android app generally has to be installed on a privileged partition such as `/system/priv-app/...` and allowed through `privapp-permissions` XML. On many devices, clock-setting APIs may also require platform signing or ROM control. Root/Magisk or a custom ROM can make this possible, but it is device-specific and not appropriate for v1.
## Consequence
Default release behavior is:
- measure NTP offset
- warn when local time appears wrong
- open Android Date & Time settings
- never silently attempt clock changes
+1 -2
View File
@@ -4,6 +4,5 @@
- `make validate-structure`: passed.
- `gradle wrapper --gradle-version 8.10.2 --distribution-type bin`: passed after adding Kotlin Compose compiler plugin.
- `./gradlew --no-daemon :app:assembleDebug`: blocked locally because the default Java 26 runtime is unsupported by Gradle 8.10.2.
- `JAVA_HOME=/usr/lib/jvm/java-21-openjdk ./gradlew --no-daemon :app:assembleDebug`: blocked locally because the installed Java 21 environment does not provide `javac` compiler capabilities.
- `gradle --no-daemon :app:assembleDebug`: Android resources, KSP, and Kotlin compilation passed; final Java compile/JDK image step is blocked locally by Java 26 `jlink` incompatibility. CI uses JDK 17.
- Gitea workflow added for automatic debug APK builds with JDK 17 and Android SDK setup.
@@ -0,0 +1,6 @@
# Phase 1 Open Issues
- Confirm first Gitea Actions APK artifact builds successfully.
- Add instrumented emulator/device smoke testing once runner or local SDK/JDK is confirmed.
- Add signed release workflow using Gitea secrets.
- Privileged/system-time setting remains out of default scope; see ADR 0002 and ADR 0003.
+11
View File
@@ -0,0 +1,11 @@
# Phase 1 Summary
Implemented in the one-shot pass:
- Phase 1 probe correctness: retained raw UDP NTP probing with reachable/DNS/timeout/packet statuses and all requested NTP metrics in the persisted result model.
- Phase 2 dashboard MVP: added profile-aware server list state, latest results, sorting modes, health scoring, and best-candidate selection.
- Phase 3 continuous testing: added continuous polling intervals of 1s, 5s, 10s, and 30s with stop/off control, history retention cleanup, median-offset disagreement warning, and local clock offset warning.
- Phase 4 profiles/export: added profile creation/switching, add/delete server flow, and CSV export/share intent.
- Phase 5 UX/release prep: added Date & Time settings action, Gradle wrapper, Gitea debug APK artifact workflow, and documented release signing follow-up.
See the app source under .
@@ -0,0 +1,10 @@
# Phase 1 Test Results
Validation performed in this session:
- Structure validation previously passed.
- Gradle wrapper generation passed after adding the Kotlin Compose compiler plugin.
- `gradle --no-daemon :app:assembleDebug`: Android resources, KSP, and Kotlin compilation passed; final Java compile/JDK image step is blocked locally by Java 26 `jlink` incompatibility. CI uses JDK 17.
- Gitea Actions workflow is configured to build with JDK 17 and Android SDK, so push-triggered CI is the intended APK validation path.
Required follow-up: inspect the first Gitea Actions run and fix any Android compile/lint findings from the runner.
@@ -0,0 +1,6 @@
# Phase 2 Open Issues
- Confirm first Gitea Actions APK artifact builds successfully.
- Add instrumented emulator/device smoke testing once runner or local SDK/JDK is confirmed.
- Add signed release workflow using Gitea secrets.
- Privileged/system-time setting remains out of default scope; see ADR 0002 and ADR 0003.
+11
View File
@@ -0,0 +1,11 @@
# Phase 2 Summary
Implemented in the one-shot pass:
- Phase 1 probe correctness: retained raw UDP NTP probing with reachable/DNS/timeout/packet statuses and all requested NTP metrics in the persisted result model.
- Phase 2 dashboard MVP: added profile-aware server list state, latest results, sorting modes, health scoring, and best-candidate selection.
- Phase 3 continuous testing: added continuous polling intervals of 1s, 5s, 10s, and 30s with stop/off control, history retention cleanup, median-offset disagreement warning, and local clock offset warning.
- Phase 4 profiles/export: added profile creation/switching, add/delete server flow, and CSV export/share intent.
- Phase 5 UX/release prep: added Date & Time settings action, Gradle wrapper, Gitea debug APK artifact workflow, and documented release signing follow-up.
See the app source under .
@@ -0,0 +1,10 @@
# Phase 2 Test Results
Validation performed in this session:
- Structure validation previously passed.
- Gradle wrapper generation passed after adding the Kotlin Compose compiler plugin.
- `gradle --no-daemon :app:assembleDebug`: Android resources, KSP, and Kotlin compilation passed; final Java compile/JDK image step is blocked locally by Java 26 `jlink` incompatibility. CI uses JDK 17.
- Gitea Actions workflow is configured to build with JDK 17 and Android SDK, so push-triggered CI is the intended APK validation path.
Required follow-up: inspect the first Gitea Actions run and fix any Android compile/lint findings from the runner.
@@ -0,0 +1,6 @@
# Phase 3 Open Issues
- Confirm first Gitea Actions APK artifact builds successfully.
- Add instrumented emulator/device smoke testing once runner or local SDK/JDK is confirmed.
- Add signed release workflow using Gitea secrets.
- Privileged/system-time setting remains out of default scope; see ADR 0002 and ADR 0003.
+11
View File
@@ -0,0 +1,11 @@
# Phase 3 Summary
Implemented in the one-shot pass:
- Phase 1 probe correctness: retained raw UDP NTP probing with reachable/DNS/timeout/packet statuses and all requested NTP metrics in the persisted result model.
- Phase 2 dashboard MVP: added profile-aware server list state, latest results, sorting modes, health scoring, and best-candidate selection.
- Phase 3 continuous testing: added continuous polling intervals of 1s, 5s, 10s, and 30s with stop/off control, history retention cleanup, median-offset disagreement warning, and local clock offset warning.
- Phase 4 profiles/export: added profile creation/switching, add/delete server flow, and CSV export/share intent.
- Phase 5 UX/release prep: added Date & Time settings action, Gradle wrapper, Gitea debug APK artifact workflow, and documented release signing follow-up.
See the app source under .
@@ -0,0 +1,10 @@
# Phase 3 Test Results
Validation performed in this session:
- Structure validation previously passed.
- Gradle wrapper generation passed after adding the Kotlin Compose compiler plugin.
- `gradle --no-daemon :app:assembleDebug`: Android resources, KSP, and Kotlin compilation passed; final Java compile/JDK image step is blocked locally by Java 26 `jlink` incompatibility. CI uses JDK 17.
- Gitea Actions workflow is configured to build with JDK 17 and Android SDK, so push-triggered CI is the intended APK validation path.
Required follow-up: inspect the first Gitea Actions run and fix any Android compile/lint findings from the runner.
@@ -0,0 +1,6 @@
# Phase 4 Open Issues
- Confirm first Gitea Actions APK artifact builds successfully.
- Add instrumented emulator/device smoke testing once runner or local SDK/JDK is confirmed.
- Add signed release workflow using Gitea secrets.
- Privileged/system-time setting remains out of default scope; see ADR 0002 and ADR 0003.
+11
View File
@@ -0,0 +1,11 @@
# Phase 4 Summary
Implemented in the one-shot pass:
- Phase 1 probe correctness: retained raw UDP NTP probing with reachable/DNS/timeout/packet statuses and all requested NTP metrics in the persisted result model.
- Phase 2 dashboard MVP: added profile-aware server list state, latest results, sorting modes, health scoring, and best-candidate selection.
- Phase 3 continuous testing: added continuous polling intervals of 1s, 5s, 10s, and 30s with stop/off control, history retention cleanup, median-offset disagreement warning, and local clock offset warning.
- Phase 4 profiles/export: added profile creation/switching, add/delete server flow, and CSV export/share intent.
- Phase 5 UX/release prep: added Date & Time settings action, Gradle wrapper, Gitea debug APK artifact workflow, and documented release signing follow-up.
See the app source under .
@@ -0,0 +1,10 @@
# Phase 4 Test Results
Validation performed in this session:
- Structure validation previously passed.
- Gradle wrapper generation passed after adding the Kotlin Compose compiler plugin.
- `gradle --no-daemon :app:assembleDebug`: Android resources, KSP, and Kotlin compilation passed; final Java compile/JDK image step is blocked locally by Java 26 `jlink` incompatibility. CI uses JDK 17.
- Gitea Actions workflow is configured to build with JDK 17 and Android SDK, so push-triggered CI is the intended APK validation path.
Required follow-up: inspect the first Gitea Actions run and fix any Android compile/lint findings from the runner.
@@ -0,0 +1,6 @@
# Phase 5 Open Issues
- Confirm first Gitea Actions APK artifact builds successfully.
- Add instrumented emulator/device smoke testing once runner or local SDK/JDK is confirmed.
- Add signed release workflow using Gitea secrets.
- Privileged/system-time setting remains out of default scope; see ADR 0002 and ADR 0003.
+11
View File
@@ -0,0 +1,11 @@
# Phase 5 Summary
Implemented in the one-shot pass:
- Phase 1 probe correctness: retained raw UDP NTP probing with reachable/DNS/timeout/packet statuses and all requested NTP metrics in the persisted result model.
- Phase 2 dashboard MVP: added profile-aware server list state, latest results, sorting modes, health scoring, and best-candidate selection.
- Phase 3 continuous testing: added continuous polling intervals of 1s, 5s, 10s, and 30s with stop/off control, history retention cleanup, median-offset disagreement warning, and local clock offset warning.
- Phase 4 profiles/export: added profile creation/switching, add/delete server flow, and CSV export/share intent.
- Phase 5 UX/release prep: added Date & Time settings action, Gradle wrapper, Gitea debug APK artifact workflow, and documented release signing follow-up.
See the app source under .
@@ -0,0 +1,10 @@
# Phase 5 Test Results
Validation performed in this session:
- Structure validation previously passed.
- Gradle wrapper generation passed after adding the Kotlin Compose compiler plugin.
- `gradle --no-daemon :app:assembleDebug`: Android resources, KSP, and Kotlin compilation passed; final Java compile/JDK image step is blocked locally by Java 26 `jlink` incompatibility. CI uses JDK 17.
- Gitea Actions workflow is configured to build with JDK 17 and Android SDK, so push-triggered CI is the intended APK validation path.
Required follow-up: inspect the first Gitea Actions run and fix any Android compile/lint findings from the runner.