ADO → Jira-Cloud inline-image syncing — recommended pattern for the ADF media-node side?

Working bi-directional sync of inline images between Jira Cloud and Azure DevOps. We’ve cracked the Jira → ADO direction end-to-end (5/5 sandbox cases — comments, descriptions, multi-image, dedupe collisions, mixed Jira-attachment + external). Stuck on the ADO → Jira-Cloud direction in a way that I haven’t seen articulated in adjacent threads, so wanted to surface the underlying constraint we’re hitting.

Adjacent threads we’ve read:

The underlying constraint we’re hitting on ADO → Jira-Cloud:

When an ADO user pastes a screenshot inline into a comment, the image is stored as an internal blob in the comment HTML — not surfaced as a standard work-item attachment that attachmentHelper.mergeAttachments would carry across. So nothing reaches the Jira side via the normal sync path.

Even if we fetched the ADO blob ourselves via REST and uploaded it to Jira via the Attachments API, we can’t make Jira render it inline in the comment, because:

  1. replica.comments[].body is string-only on the Jira side (not ADF) — we have no way to emit ADF mediaSingle/media nodes from a Groovy script.
  2. Jira Cloud’s comment ADF only accepts media nodes referencing Atlassian Media Services UUIDs, not arbitrary <img src="https://…">. Wiki-style !filename.png! works for Jira DC but not Jira Cloud.

This matches the symptoms described on Topic 6795 (“Preview unavailable”, image arriving as a link rather than a render) — the script writes an <img> reference but Jira Cloud silently demotes it because the renderer doesn’t see a valid media-node.

Questions:

  1. Is there a recommended pattern for ADO → Jira-Cloud inline-comment images that bridges into proper ADF media nodes? Specifically, anything that surfaces or returns an Atlassian Media Services UUID from inside the Groovy script.
  2. Are there commentHelper / mediaHelper / undocumented Hub Object capabilities that handle this transformation? The fact that nodeHelper.toMarkDownComments is recommended suggests there’s a path, but in our testing inline images don’t survive.
  3. If neither, is the right path an out-of-band Atlassian Media Services upload (3-step: upload → bind to attachment → reference UUID in ADF), invoked outside Exalate? We’re aware of the httpClient.post(url, body, headers) 3-arg MissingMethodException limitation, so this would have to happen outside the script.

For the immediate term we’re shipping a placeholder breadcrumb on the ADO → Jira side (rather than silently dropping the inline reference) and educating ADO users to use the paperclip / Add Attachment button for screenshots they want the Jira side to see. But interested if there’s a better path that Exalate engineers have in flight.