From a97ad66e1fb21bebd72b5f82e7ffc86529db8db0 Mon Sep 17 00:00:00 2001 From: Krzysztof kuhy Rudnicki Date: Wed, 12 Aug 2026 19:22:50 +0200 Subject: [PATCH] Whitelist RunnerUp day and night, so it can always sync RunnerUp needs to stay enabled after a run to export the TCX file screen-locker verifies against; being disabled by focus mode at home silently blocked that. It's straightforwardly beneficial, so treat it like the other always-available apps: present in both WHITELIST and NIGHT_WHITELIST. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_013SH7XBkpEqQX4KghHdgx9T --- .../runnerup-always-available-2026-08-12.json | 37 +++++++++++++++++++ focus_owner/assets/policy.json | 4 ++ phone_focus_mode/config.sh | 6 +++ 3 files changed, 47 insertions(+) create mode 100644 docs/superpowers/evidence/runnerup-always-available-2026-08-12.json diff --git a/docs/superpowers/evidence/runnerup-always-available-2026-08-12.json b/docs/superpowers/evidence/runnerup-always-available-2026-08-12.json new file mode 100644 index 00000000..f1f67e1d --- /dev/null +++ b/docs/superpowers/evidence/runnerup-always-available-2026-08-12.json @@ -0,0 +1,37 @@ +{ + "intent": "Whitelist RunnerUp so it stays enabled everywhere (home, away, curfew), since being disabled at home was blocking its TCX auto-export, which screen-locker's workout verification depends on.", + "scope": [ + "phone_focus_mode/config.sh", + "focus_owner/assets/policy.json", + "Non-goal: root-DB fallback verification, or changing verification thresholds -- those live in screen-locker, not this repo" + ], + "changes": [ + "Added org.runnerup and org.runnerup.free to both WHITELIST (day) and NIGHT_WHITELIST (curfew) in config.sh -- both lists are required because model.py enforces night_allowed_packages as a subset of allowed_packages.", + "Regenerated focus_owner/assets/policy.json via `python3 -m python_pkg.focus_policy --config phone_focus_mode/config.sh --output focus_owner/assets/policy.json --redact-home`, keeping home coordinates redacted in the committed asset." + ], + "verification": [ + { + "command": "python3 -c \"import json; p=json.load(open('focus_owner/assets/policy.json')); print([x for x in p['allowed_packages'] if 'runnerup' in x], [x for x in p['night_allowed_packages'] if 'runnerup' in x], p['home'])\"", + "result": "pass", + "evidence": "org.runnerup and org.runnerup.free present in both lists; home lat/lon still null (redacted)." + }, + { + "command": "flutter build apk --release (focus_owner, signed with the existing kuhy-release.jks) then adb install -r on the connected Pixel 6a (23181JEGR08034)", + "result": "pass", + "evidence": "Build succeeded; install succeeded (release signature matched the already-installed app, so no uninstall was needed)." + }, + { + "command": "adb shell pm list packages -d | grep -i runnerup", + "result": "pass", + "evidence": "Empty output -- RunnerUp (org.runnerup, the installed variant) is not disabled after reinstalling focus_owner with the updated policy." + } + ], + "risks": [ + "Curfew-specific enforcement was not directly observed live (would require waiting for 23:00 or forcing a curfew-state transition on the live device-owner policy, which was avoided to not disrupt the running phone). Confidence rests on the policy.json content itself (RunnerUp present in night_allowed_packages) plus the day-state confirmation, not an on-device curfew trigger.", + "org.runnerup.free is not installed on this phone (only org.runnerup is); the .free entry is harmless but unverified since there's nothing to test it against." + ], + "rollback": [ + "Remove org.runnerup / org.runnerup.free from both WHITELIST and NIGHT_WHITELIST in config.sh, regenerate policy.json with the same --redact-home flag, rebuild focus_owner --release, adb install -r.", + "After rollback, confirm via `adb shell pm list packages -d | grep -i runnerup` that focus mode can disable it again as expected (a positive result there is a no-op-check only when curfew/away actually applies)." + ] +} diff --git a/focus_owner/assets/policy.json b/focus_owner/assets/policy.json index b94fc55c..49d08a72 100644 --- a/focus_owner/assets/policy.json +++ b/focus_owner/assets/policy.json @@ -23,6 +23,8 @@ "org.fossify.contacts", "org.fossify.messages", "org.fossify.phone", + "org.runnerup", + "org.runnerup.free", "pl.infakt.infakt", "pl.mbank", "pl.nask.mobywatel" @@ -114,6 +116,8 @@ "org.fossify.contacts", "org.fossify.messages", "org.fossify.phone", + "org.runnerup", + "org.runnerup.free", "pl.infakt.infakt", "pl.mbank", "pl.nask.mobywatel" diff --git a/phone_focus_mode/config.sh b/phone_focus_mode/config.sh index d2354e60..b741a754 100755 --- a/phone_focus_mode/config.sh +++ b/phone_focus_mode/config.sh @@ -385,6 +385,10 @@ com.sosauce.cutecalc com.ichi2.anki com.metrolist.music eu.kanade.tachiyomi.sy + +# --- Workout tracking (always beneficial; must stay enabled to export runs) --- +org.runnerup +org.runnerup.free " # ============================================================ @@ -417,6 +421,8 @@ pl.nask.mobywatel com.kunzisoft.keepass.libre com.kuhy.wake_alarm_sync com.google.android.deskclock +org.runnerup +org.runnerup.free " # ============================================================