Great, good to know.
Was that situation different from the Sercom usage with sercom4 in I2C Slave mode as in the newest code ?
I hope you can make it work again. Can you try it with a single byte, without 'String' and without 'Serial' in the onRequest and onReceive interrupt handlers ?
That is not how it works. The official standard is the official standard. Only if you go back in time to about 1980 and tell the developers of the I2C bus that they are doing it wrong and they should do it differently, then you can change it. But you would no longer be in the same universe as us, because you have created a new time line.
You see what happens when you don't follow the standard of the I2C bus ? The whole universe is in danger.
It is too long ago that I used a ATSAMD21G, so I don't know anymore how those USB and native ports turned out.
The I2C bus works best with packages of data of a fixed length with binary data. For example an array of 'float' numbers or a 'struct'.
No one uses readable ASCII over the I2C bus.
When you use a Serial function inside an interrupt (such as the onRequest or onReceive handler), then you use a interrupt driven function inside a interrupt. That can go bad.
When you use the String class inside an interrupt, then the heap is used a lot. A interrupt routine should be shorter and simpler.