I'm not sure whether this is the right place to send a bug report on
l3tl. The following code causes a runaway argument. I didn't look yet
at the implementation, but if needed, I can propose a bug fix some
time this week.

\tl_new:Nn \g_my_tl {aabono}
\tl_replace_in:Nnn \g_my_tl {bonobo} {whatever}

Basically what happens is that the string we are looking for is put
directly after the `\g_my_tl`, forming `bonobo`. This `bonobo` is
replaced, and then the termination tries to remove the extra
`bonobo\q_stop` which was added. This fails. The only way out is
apparently to use two markers. It has been done a couple of times
before (stringstring, perhaps?), so I just need to hunt for the

aabono -> aabonobonobo\q_stop -> aawhatevernobo\q_stop -> BOOM!

Bruno Le Floch