Files
alfred-mobile/FIXES_2026-02-04_PART2.md
jknapp 6d4ae2e5c3 Initial commit: Alfred Mobile - AI Assistant Android App
- OAuth authentication via Authentik
- WebSocket connection to OpenClaw gateway
- Configurable gateway URL with first-run setup
- User preferences sync across devices
- Multi-user support with custom assistant names
- ElevenLabs TTS integration (local + remote)
- FCM push notifications for alarms
- Voice input via Google Speech API
- No hardcoded secrets or internal IPs in tracked files
2026-02-09 11:12:51 -08:00

6.8 KiB

Additional Fixes - 2026-02-04 (Part 2)

Time: 08:20 PST
Issues: Alarm tool + Network reconnection

Issue 1: Alfred Using Wrong Alarm Tool

Problem

When user asked Alfred to "set an alarm" from within the mobile app, no alarm was delivered. Testing showed manual alfred-notify commands worked fine, indicating Alfred was using the wrong tool.

Root Cause

The alarms skill was using outdated code:

  1. Wrong command: Used old mobile-notify alarm via curl wrapper instead of alfred-notify
  2. Wrong cron format: Used --session main --system-event instead of isolated + agentTurn
  3. Wrong priority: Used priority: default instead of priority: high for alarms

Files Modified

  1. ~/.openclaw/workspace/skills/alarms/send-alarm-curl.sh

    • Changed from curl API call to alfred-notify CLI
    • Before: curl -X POST http://localhost:18790/api/notify ...
    • After: alfred-notify --alarm --title "🔔 Alarm" "$MESSAGE"
  2. ~/.openclaw/workspace/skills/alarms/alarms

    • Complete rewrite of cron job creation logic
    • Changed from: --session main --system-event
    • Changed to: sessionTarget: "isolated" with agentTurn payload
    • Now uses proper JSON format for cron jobs
    • Commands execute alfred-notify directly from cron
  3. ~/.openclaw/workspace/skills/alarms/SKILL.md

    • Updated documentation to reflect alfred-notify usage
    • Documented correct cron format (isolated + agentTurn)
    • Removed references to old mobile-notify command

Code Changes

Before (wrong):

// Used curl wrapper with system event (doesn't execute commands)
const systemEvent = `nohup ${wrapperPath} "${message}" >/dev/null 2>&1 &`;
const cmd = `openclaw cron add --session main --system-event '${systemEvent}' ...`;

After (correct):

// Uses alfred-notify in isolated session with agentTurn
const cronData = {
  name: `alarm:${message}`,
  schedule: { kind: "at", atMs: timestamp },
  payload: {
    kind: "agentTurn",
    message: `Run: ~/.openclaw/workspace/alfred-proxy/alfred-notify --alarm --title "🔔 Alarm" "${message}"`,
    deliver: false
  },
  sessionTarget: "isolated",
  enabled: true
};

Testing

Before fix:

User: "Set an alarm for 5 minutes"
Alfred: [creates cron job]
Result: ❌ No alarm delivered (systemEvent doesn't execute commands)

After fix:

User: "Set an alarm for 5 minutes"
Alfred: [creates cron job with agentTurn]
Result: ✅ Alarm delivered via FCM after 5 minutes

Issue 2: App Reconnecting Without Network

Problem

When tablet was locked/asleep with no network connection, the app would:

  1. Continuously attempt to reconnect every 5-10 seconds
  2. Increment retry counter even though network was unavailable
  3. Eventually hit max retry limit (10 attempts)
  4. Give up completely, requiring manual app restart

This was wasteful and meant the app wouldn't reconnect when network returned.

Root Cause

In GatewayClient.kt, the reconnection logic checked for network availability but still incremented reconnectAttempts even when network was down:

if (!isNetworkAvailable()) {
    // ...
    reconnectAttempts++  // ❌ Wrong! Counting network outage as failed attempt
    // ...
}

Solution

Don't increment reconnectAttempts when network is unavailable - only count actual connection attempts:

if (!isNetworkAvailable()) {
    // Use fixed 10-second delay
    // Don't increment reconnectAttempts
    val delay = 10000L
    Log.d(TAG, "Network unavailable - will check again in ${delay}ms (not counting as retry attempt)")
    // ...
}

Benefits

  1. Unlimited network checks: App can wait indefinitely for network to return
  2. Preserves retry budget: Only actual connection failures count toward max retries
  3. Battery efficient: 10-second check interval is reasonable
  4. Auto-recovery: When network returns, app automatically connects

Files Modified

  • alfred-mobile/app/src/main/java/com/openclaw/alfred/gateway/GatewayClient.kt
    • Line ~132: Removed reconnectAttempts++ from network unavailable branch
    • Changed to fixed 10-second delay instead of exponential backoff
    • Updated log message to clarify it's not a retry attempt

Behavior Comparison

Before:

Network down → Wait 5s → Check (attempt 1/10)
Network down → Wait 10s → Check (attempt 2/10)
Network down → Wait 20s → Check (attempt 3/10)
...
Network down → Wait 30s → Check (attempt 10/10)
Network down → Give up ❌
[Network returns but app won't reconnect]

After:

Network down → Wait 10s → Check (no attempt counted)
Network down → Wait 10s → Check (no attempt counted)
Network down → Wait 10s → Check (no attempt counted)
...
[Continues indefinitely]
Network returns → Connects automatically ✅

Additional Documentation Updates

No additional documentation needed - these were implementation bugs rather than feature changes.

Testing Checklist

Alarm Tool Fix

  • Manual alfred-notify works
  • Ask Alfred to "set an alarm for 1 minute" from app
  • Verify alarm delivered after 1 minute
  • Check cron job format: openclaw cron list --json

Network Reconnection Fix

  • Lock tablet
  • Turn off WiFi
  • Wait > 10 reconnection cycles (> 2 minutes)
  • Turn WiFi back on
  • Verify app reconnects automatically
  • Check logs: retry attempts should not have exceeded limit

Deployment

Alarm Tool

  • Fixed skill files already in place
  • No app rebuild needed (server-side fix)
  • Will take effect on next alarm Alfred creates

Network Reconnection

  • Requires app rebuild and install
  • Code changes already applied
  • Need to build and deploy:
    cd alfred-mobile
    export JAVA_HOME=~/android-dev/jdk-17.0.2
    export ANDROID_HOME=~/android-dev/android-sdk
    ./gradlew assembleDebug
    adb install -r app/build/outputs/apk/debug/app-debug.apk
    

Impact

Alarm Tool Fix

  • Severity: HIGH - Core functionality broken
  • User Impact: Unable to set alarms via voice/chat
  • Resolution: Immediate - works as soon as skill is fixed
  • Workaround: Manual alfred-notify commands worked

Network Reconnection Fix

  • Severity: MEDIUM - Quality of life issue
  • User Impact: App stops reconnecting after device sleep
  • Resolution: Requires app update
  • Workaround: Manual app restart after network returns

Next Steps

  1. Rebuild and install app with network fix
  2. Test alarm creation via Alfred chat
  3. Test network recovery by toggling WiFi while locked
  4. Monitor for 24 hours to verify stability
  5. Update android-app-todo.md if any issues found

Status: Both fixes implemented and ready for testing
App rebuild required: Yes (for network fix only)
Server changes: Done (alarm tool fix)