-
For broad WhatsApp triage, shortlist before deep reads. Start with cheap
chat/message discovery such as wacli chats list --limit 20 --json, targeted
wacli messages search ... --limit 20, or the existing recent-reply helpers
when the target is known.
-
Use previews, sender/contact, timestamp, unread/recent state, and helper
fields such as recentConversation, latestInboundReply, and continuity
to decide what deserves deeper reading.
-
Filter obvious noise early: muted group chatter, routine reactions, receipts,
automated notifications, and media-only items that do not affect the user's
next action.
-
Bucket triage results as Urgent, Needs reply soon, Waiting on them,
Schedule, Delegate, Archive / no action, or FYI.
-
State scope and confidence in every broad triage result: target set,
timeframe/search terms, result count or limit, and what was excluded.
-
Treat "needs reply" as an inference until recent conversation context shows
the user is likely the next responder.
-
Before drafting, sending, or monitor-driven reply decisions, use the narrowest
current read/check path for the exact target and inspect enough conversation
context to avoid answering a stale preview.
-
wacli chats list --limit 20 --query "name or number"
-
wacli messages search "query" --limit 20 --chat <jid>
-
wacli messages search "invoice" --after 2025-01-01 --before 2025-12-31
-
Recent-reply reconciliation for monitors/reply checks:
skills/wacli/scripts/wacli-recent-reply.sh --target <phone-or-jid> --json
This inspects the local wacli.db, resolves real sibling chats from stored
names/contacts/aliases, and returns the newest inbound from_me=0 across all
candidate chats, plus recentConversation and continuity fields for the
active chat.
-
Monitor job helper (stateful baseline + reconciliation in one command):
skills/wacli/scripts/wacli-monitor-check.sh --target <phone-or-jid> --json
This stores baseline state under ~/.openclaw/wacli-monitor-state/ by default
so cron jobs can use the same command on every wake.
For negotiation/follow-up monitors, do not compose a reply from only
latestInboundReply.effectiveText; use recentConversation so the wake run
sees prior outbound turns, and suppress sends when
continuity.lastOutboundIsRepeatOfPrevious is true unless the user explicitly
wants to resend the same line.