Tags: SysAdminDoc/OpenLumen
Tags
fix(verification): add Linux classifier entries for 5 plugin-repo art… …ifacts CI on ubuntu-latest fetches additional Gradle Central Plugin Repository modules / poms / classifier-bound jars that the Windows-side metadata regen (daec0bc) didn't capture: - guava-parent-33.3.1-jre.pom - junit-bom-5.10.2.module - junit-bom-5.11.0-M2.module - kotlin-gradle-plugins-bom-2.2.10.module - kotlin-gradle-plugins-bom-2.2.10.pom SHA-256s were computed locally against plugins.gradle.org for each file and added alongside the existing Windows-side entries.
fix(verification): regen metadata, disable PGP sig verify The verification-metadata.xml was missing checksums for AGP 9.2.1 and ~93 transitive deps, blocking every Gradle invocation on local + CI. Bootstrapped fresh sha256 hashes via --write-verification-metadata. verify-signatures flipped to false because no keyring file (verification-keyring.gpg/keys) exists in the repo — Gradle was set up to verify PGP signatures it had no way to verify, so the hard-fail mode was effectively a build-blocker rather than a security gate. Metadata-hash verification (sha256) still runs, which is the meaningful gate without keyring infrastructure.
Release v0.4.0 — engineering audit pass + first unit tests Deep correctness, lifecycle, security, and UX hardening pass across the entire codebase. Highlights: CONCURRENCY / LIFECYCLE - LumenService now serializes ColorEngine.apply()/clear() via Mutex; the prefs flow is conflate()d so rapid slider drags don't queue dozens of su calls. - engine/lastApplied/lastShouldBeActive are @volatile. - onDestroy clear() runs inside runBlocking { NonCancellable + withTimeoutOrNull(2s) } so teardown never races lifecycleScope cancellation. - LumenTileService creates a fresh per-onCreate scope and cancels in onDestroy. - Tile toggle now uses atomic prefs.update {} (no read-then-write race). SU WRAPPER (core-engine/Su.kt) - Killed the double-spawn bug in isAvailable() (Magisk no longer prompts twice). - redirectErrorStream(true) on both commands — fixes the stderr-buffer deadlock. - All readers in 'use {}' — no FD leaks on timeout. - runShell got a 4s timeout and drains stdout so KCAL writes can't deadlock. - Failures logged via android.util.Log under OpenLumen/Su. ENGINES - OverlayEngine guards Settings.canDrawOverlays() before addView; catches the throw path. Removed dead else branch in clear(). - ColorDisplayManagerEngine tries (Context) ctor before no-arg, caches the reflected Method handles + manager instance. BOOT - Drop LOCKED_BOOT_COMPLETED — DataStore is in user-protected storage. Listening there just deadlocked on first(). Direct-boot deferred to v0.5+. - 8s timeout on the prefs read inside the receiver so a hung DataStore can't leak the PendingResult. UI / COMPOSE / A11Y - Home toggle Card is now whole-card-clickable (was only the Switch thumb). - Intensity and Dim sliders carry semantics { stateDescription = 'N percent' } so TalkBack reads useful values. - Bottom-nav icons get contentDescription = labelRes. - Dialog visibility flags moved to rememberSaveable so rotations/process death survive in-flight dialogs. - AboutScreen.LaunchedEffect(result) returns early on null instead of firing the Toast pipeline twice. DEFENSIVE INPUT - PreferencesStore.importFrom caps reads at 64 KB, runs sanitize() over every numeric field (R/G/B/dim/gamma/lat/lng/offsets/hour/minute) clamping to valid ranges. Preserves the user's enabled flag. - LumenService.mapMode() coerces schedule hour/minute before LocalTime.of() so corrupted prefs can never throw inside the FGS. DIAGNOSTICS - core-engine/Log.kt: thin android.util.Log wrapper with 23-char tag cap. - Every catch/fallback path in service + engines now logs. TESTS (new!) - core-engine: LumenMatrixTest covers identity / dim coercion / gamma / SurfaceFlinger16 layout / overlay ARGB clamping (9 tests). - core-schedule: SolarCalculatorTest cross-checks NOAA sunrise/sunset for NY, Sydney, Quito, Tromso. ScheduleTest covers AlwaysOn/Off, FixedTime midnight wrap, nextTransition correctness — caught a real bug. - Bug caught + fixed: nextTransition for FixedTime was returning the first future candidate in declaration order instead of the chronologically earliest. At 23:00 with a 22-7 window it returned '22:00 tomorrow' instead of '07:00 tomorrow'. Now sorts the candidate set first. - JUnit 4 + Truth wired via libs.versions.toml. VERIFIED - ./gradlew :core-engine:test :core-schedule:test :app:assembleRelease all green. - Installed on Samsung Galaxy S25 Ultra (Android 16) + Galaxy S22 Ultra (Android 16). versionCode=5 confirmed via pm path + dumpsys. No FATAL or AndroidRuntime exceptions in logcat. - v1+v2+v3 APK signing schemes.
Release v0.3.0 — persistence + reliability Bumps versionCode 2->3, versionName 0.2.0->0.3.0. Updates README shields.io badge + features list, CHANGELOG with full v0.3.0 changeset, CLAUDE.md version history, ROADMAP v0.3 (2/3 boxes checked, schema migration and direct-boot boot deferred with rationale).
Release v0.2.0 — UI completeness pass Bumps versionCode 1->2, versionName 0.1.0->0.2.0. Updates README shields.io badge, features list, CHANGELOG with full v0.2.0 changeset, CLAUDE.md version history line, and ROADMAP v0.2 section to all-checked.