Tracked Changes with Strict Document Format

I’ve run into another unexpected change set involving lists. It happens when deleting an empty list item with backspace.

Before:

<ol>
  <li><p>Item 1</p></li>
  <li><p>Item 2</p></li>
  <li><p>Item 3</p></li>
  <li><p></p></li>
</ol>

After:

<ol>
  <li><p>Item 1</p></li>
  <li><p>Item 2</p></li>
  <li>
    <p>Item 3</p>
    <p></p>
  </li>
</ol>

The changeset contains one deleted span and no inserted spans:

// DeletedSpan
{
    data : undefined,
    from: 1499,
    pos: 1499,
    slice: {content: Fragment, openStart: 1, openEnd: 1},
    to: 1501
}

where the slice is two list_item nodes with no content.

I would expect to get a change set containing one deleted list_item and one inserted paragraph.

Looking more closely at prosemirror-changeset leads me to believe it is unable to understand the nuance of a backwards join (which I believe is happening in this case). The transaction here is one replace step

// ReplaceStep 
{
    from: 1499,
    slice: {content: Fragment, openStart: 0, openEnd: 0}, // An empty slice
    structure: true,
    to: 1501
}

And transaction.mapping.maps (which I pass into ChangeSet.addSteps) has only one StepMap

// StepMap
{
    inverted: false,
    ranges: [1499, 2, 0]
}

I do not think that ChangeSet can do anything with that one StepMap other than find one deleted span.

@marijn is prosemirror-changeset returning the correct results? It certainly seems to be returning the only results it can given the input. But it does not really seem like the correct results to me. If prosemirror-changeset is working correctly then it looks like I will need to approach the detection of changes differently and not solely depend on prosemirror-changeset.