Sorry Chris, I totally missed the point of the previous experiment until now.  I think if both of the strings are not marked html_safe, it's ok to concatenate them and then mark them safe.  See my further experiments below (I had to manually escape a bunch of stuff below to get it to look right in the github comment).  With that info, should we still change it to mark both of them independently?
<pre>
[1] pry(main)> string = 'a string'
=> "a string"
[2] pry(main)> html = '&lt;a>anchor&lt;/a>'
=> "&lt;a>anchor&lt;/a>"
[3] pry(main)> string + html
=> "a string&lt;a>anchor&lt;/a>"
[4] pry(main)> string.html_safe + html
=> "a string&amp;lt;a&amp;gt;anchor&amp;lt;/a&amp;gt;"
[5] pry(main)> string + html.html_safe
=> "a string&lt;a>anchor&lt;/a>"
[6] pry(main)> string.html_safe + html.html_safe
=> "a string&lt;a>anchor&lt;/a>"
</pre>