Background temporal events never fire — registerForTemporalEvent silently ignored

Background temporal events never fire on Epix 2 Pro (47mm) — registerForTemporalEvent silently ignored

Device: Epix 2 Pro 47mm SDK: connectiq-sdk-mac-8.3.0 minApiLevel: 3.4.0 App type: watch-app (sideloaded via USB for development, not yet published)

Summary

Background.registerForTemporalEvent() is called successfully (no exceptions, confirmed via on-device debug log written to Storage), but ServiceDelegate.onTemporalEvent() is never invoked by the system — confirmed across two separate real-device test windows of 53 minutes and >7 hours, with zero invocations in either.

Manifest (relevant excerpt)

xml
<iq:application id="159a32c1-1d84-496e-ad00-1a3557457abb" type="watch-app"
    entry="BodyCharge.MainApp" minApiLevel="3.4.0">
    <iq:permissions>
        <iq:uses-permission id="Background"/>
        <iq:uses-permission id="SensorHistory"/>
    </iq:permissions>
</iq:application>

(No <iq:background> element — confirmed this is not a valid child in this manifest schema version; build fails with a schema validation error if added.)

Code (relevant excerpt)

monkeyc
(:background)
class BgService extends Sys.ServiceDelegate {
    function initialize() { Sys.ServiceDelegate.initialize(); }

    function onTemporalEvent() {
        // This log line is written to Storage as the VERY FIRST statement.
        // It never appears in 7+ hours of real-device testing.
        try { dbgLog("BG-ENTER"); } catch(eLog) {}

        registerBgSoon(); // re-arms next event
        try {
            performCheck("BG");
        } catch (ex) {}
        BG.exit({ "ts" => nowSec() });
    }
}

function registerBgSoon() {
    try {
        BG.registerForTemporalEvent(Time.now().add(new Time.Duration(60)));
    } catch(e) { /* not hit */ }
}

getServiceDelegate() is implemented on AppBase and returns [new BgService()]. Build succeeds with the compiler explicitly confirming background wiring:

WARNING: epix2pro47mm: The entry point '$.xxx.MainApp' was implicitly
added to the background process since the app contains declarations
annotated with (:background).

What I've verified/ruled out

  • registerForTemporalEvent() call itself does not throw (wrapped in try/catch, confirmed via persistent debug log).
  • Manifest permissions Background and SensorHistory are present.
  • App works perfectly when kept in the foreground — the alarm logic itself (threshold crossing, debounce, vibration+tone) fires correctly and has been confirmed working live on-device.
  • Tested with request interval as low as 60 seconds.
  • No Do Not Disturb / Sleep mode active during test windows.
  • Simulator: manually triggering "Simulate Temporal Event" invokes onTemporalEvent() correctly and the alarm logic runs as expected. The issue is specific to the real device.

Question

Is there a known issue with registerForTemporalEvent on Epix 2 Pro (or this firmware version), or an additional device-side permission/setting (e.g. via Garmin Connect Mobile) required for a sideloaded app to actually receive background wake-ups, beyond the manifest Background permission?

Any pointers appreciated — happy to provide the full watch firmware version or additional logs on request.