This exact symptom - “sync completes, Status field silently does nothing, zero errors” - is almost always caused by the incoming sync rule failing to match on the issue type, so the whole status-mapping block for that type gets skipped without ever throwing anything.
Check the actual system type name your Incoming sync rule is comparing against. If your script branches on something like:
if (replica.type?.name?.equalsIgnoreCase("[System] Service request")) { ... }
else if (replica.type?.name?.equalsIgnoreCase("[System] Change Request")) { ... }
else if (replica.type?.name?.equalsIgnoreCase("[System] Incident")) { ... }
double-check the exact string your remote system sends for that issue type. In our case it turned out to be “[System] Change”, not “[System] Change Request”. Because the comparison never matched, the entire status-mapping block for that type was skipped every single time - no exception, just a silent no-op, because the script fell through to a generic else with only a log.info() call (which you’d only ever see by digging through support.zip).
The fastest way to confirm this without downloading support.zip repeatedly: temporarily add a debug.error() call (from the built-in debugHelper) right at the top of that block, instead of log.info(), e.g.:
debug.error("replica.type.name = [" + replica.type?.name + "]")
Unlike log.info, debug.error() throws a visible sync error carrying your message straight into the tab: Error in the UI. It does block that one issue’s sync until you Resolve & Retry it, but for a single diagnostic check that’s a small price for not having to generate and grep through a support.zip. Once you can see the actual type name being sent, fix the comparison to match it exactly, then remove the debug.error() line - otherwise it’ll keep blocking every future sync on that connection.
Recommended Changes:
- Ticket type check (Change Request was never being recognized)
BEFORE:
else if (replica.type?.name?.equalsIgnoreCase("[System] Change Request")){ ... }
AFTER:
else if (replica.type?.name?.equalsIgnoreCase("[System] Change")){ ... }
Why: Jira Cloud sends the internal type name as “[System] Change”, not “[System] Change Request”. The old check could never match, so this whole block of code (which handles the status mapping) was always skipped for Change Request tickets, without any error being shown.
- Status name matching (case sensitivity)
BEFORE:
def remoteStatusName = replica.status.name issue.setStatus(statusMap[remoteStatusName] ?: remoteStatusName)
AFTER:
def lookupStatusCaseInsensitive = { Map map, String remoteName -> if (remoteName == null) return null def match = map.find { key, value -> key.equalsIgnoreCase(remoteName.trim()) } return match ? match.value : null } ... def remoteStatusName = replica.status.name def targetStatusName = lookupStatusCaseInsensitive(statusMap, remoteStatusName) ?: remoteStatusName issue.setStatus(targetStatusName)
--
Kind regards,
Ashar