Freeze one disputed control transaction
Record intended and observed node, installed release, loaded modules, exact action, ActionID, manager session, all arguments, mailbox and context, EntityID when present, every raw response frame, times, parser version and disputed outcome. Redact credentials and mailbox-owner data.
Classify the earliest gap as wrong node, unavailable action, denied action, wrong owner, over-broad scope, wrong mailbox identity, local EntityID rejection, omitted count default, incomplete response, parser loss or downstream MWI failure.
Confirm release and module ownership first
Use the running action inventory and module state. Do not assume VoicemailRefresh has the same backing module because the reviewed branch-23 page names app_voicemail_imap while the branch-22 page names app_voicemail_odbc. Require res_mwi_external_ami for MWIGet and MWIUpdate.
For MailboxStateChange, verify a maintenance release that documents the action. An unknown action on an earlier installed release is not a permission or mailbox-state result.
Reduce refresh scope before retrying
If a refresh was broad, stop repeated retries and restate the intended target. Supply both Context and Mailbox for one mailbox when the installed backend supports that scope. Preserve the response and compare backend evidence after the bounded poll.
A successful refresh request signals a poll; it does not prove an external change existed, message storage was read, counts changed or a phone received MWI.
Make external-MWI counts and identity explicit
For MWIUpdate, send the specific mailbox plus both OldMessages and NewMessages; the documented defaults are zero when fields are absent. For MWIGet, distinguish a literal mailbox from a slash-delimited regular expression and retain the complete response series.
Compare only state owned by res_mwi_external. Do not overwrite local voicemail evidence to make external counts agree.
Reject local use of remote synchronization
For MailboxStateChange, preserve the remote source and EntityID. A matching local EntityID is documented to be rejected, and the action is not intended to set local mailbox state. Correct the topology or action selection instead of substituting another identifier.
After an accepted remote update, continue separately through subscription, NOTIFY delivery and endpoint rendering. Use the existing PJSIP MWI diagnostic for those downstream boundaries.
Retest one bounded path and close the earliest fault
Start a clean authenticated session, issue one narrow request with a fresh identifier and retain its response before dashboard transformation. Repair only the demonstrated release, module, permission, scope, identity, count, EntityID, framing or parser fault, then restore approved access limits.
No PBX, module, mailbox, voicemail store, IMAP or ODBC backend, manager configuration, credential, response, subscription, NOTIFY, endpoint, phone, message, playback or live call was inspected or tested.
Sources & applicability
Primary references for the technical details above. Operational examples and planning checklists are VoIP.info editorial guidance.
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.