Basically what I suspected: inserting `<script>` elements into a `<table>` doesn't trigger the browser's "oh shit, I want a tbody" feature, but inserting table-related elements *does*. So, after initial render with an example `<ul>`:

    <div id="ember119" class="ember-view">
      <ul>
        <script id="metamorph-0-start" type="text/x-placeholder"></script>
        <script  id="metamorph-1-start" type="text/x-placeholder"></script>
        <li>
          <script id="metamorph-3-start" type="text/x-placeholder"></script>
          Jason
          <script id="metamorph-3-end" type="text/x-placeholder"></script>
        </li>
        <script id="metamorph-1-end" type="text/x-placeholder"></script>
        <script  id="metamorph-2-start" type="text/x-placeholder"></script>
        <li>
          <script id="metamorph-4-start" type="text/x-placeholder"></script>
          Zack
          <script id="metamorph-4-end" type="text/x-placeholder"></script>
        </li>
        <script id="metamorph-2-end" type="text/x-placeholder"></script>
        <script  id="metamorph-0-end" type="text/x-placeholder"></script>
      </ul>
    </div>

And with a `<table>`:

    <div id="ember119" class="ember-view">
      <table>
        <script id="metamorph-0-start" type="text/x-placeholder"></script>
        
        <script  id="metamorph-1-start" type="text/x-placeholder"></script>
        <tbody>
          <tr>
            <td>
              <script id="metamorph-3-start" type="text/x-placeholder"></script>
              Jason
              <script id="metamorph-3-end" type="text/x-placeholder"></script>
            </td>
          </tr>
          <script id="metamorph-1-end" type="text/x-placeholder"></script>
          
          <script  id="metamorph-2-start" type="text/x-placeholder"></script>
          <tr>
            <td>
              <script id="metamorph-4-start" type="text/x-placeholder"></script>
              Zack
              <script id="metamorph-4-end" type="text/x-placeholder"></script>
            </td>
          </tr>
          <script id="metamorph-2-end" type="text/x-placeholder"></script>
          <script  id="metamorph-0-end" type="text/x-placeholder"></script>
        </tbody>
      </table>
    </div>


In the second example the first two placeholders are inserted, then when the table-related elements start getting inserted the `<tbody>` gets put in first and screws the order of placeholders and their ranges. When the entire collection is replaced metamorphs 1 and 2 are removed, which snips the opening `<tbody>`:
  
    <div id="ember119" class="ember-view">
      <table>
        <script id="metamorph-0-start" type="text/x-placeholder"></script>
          <script  id="metamorph-0-end" type="text/x-placeholder"></script>
          </tbody>
      </table>
    </div>

The browser corrects this by adding the opening tag back for the node that contains `the metamorph-0-end`:

    <div id="ember119" class="ember-view">
      <table>
        <script id="metamorph-0-start" type="text/x-placeholder"></script>
        <tbody>
          <script  id="metamorph-0-end" type="text/x-placeholder"></script>
        </tbody>
      </table>
    </div>

And then, because we're writing into the table directly after `metamorph-0-start`, a `<tbody>` is added for them:
  
    <table>
      <script id="metamorph-0-start" type="text/x-placeholder"></script>
      <tbody>
        <script id="metamorph-5-start" type="text/x-placeholder"></script>
        <tr>
          <td>
            <script id="metamorph-7-start" type="text/x-placeholder"></script>
            Trini
            <script id="metamorph-7-end" type="text/x-placeholder"></script>
          </td>
        </tr>
        <script id="metamorph-5-end" type="text/x-placeholder"></script>
        <script id="metamorph-6-start" type="text/x-placeholder"></script>
        <tr>
          <td>
            <script id="metamorph-8-start" type="text/x-placeholder"></script>
            Kimberly
            <script id="metamorph-8-end" type="text/x-placeholder"></script>
          </td>
        </tr>
      <script id="metamorph-6-end" type="text/x-placeholder"></script>
      </tbody>
      <tbody>
        <script id="metamorph-0-end" type="text/x-placeholder"></script>
      </tbody>
    </table>

(Interestingly the `<tbody>` is inserted before `metamorph-5-start`, which is different than I expected.)

I can see three options:
a) change nothing and just tell people they *must* use a `<tbody>` in their templates (which I suppose is more W3C approved)
b) check whether a metamorph is a going to be child of a table and insert the tbody ourselves so it's in the correct position
c) use a function like `fixParentage()` - although in this case we'll be fixing the start rather than the end metamorph.

Thoughts?