Actually, since $custom_insertable_text is not added to the output in stock order.php (merely suggested that it could be added by editing order.php), I decided to drop it and use another, purely internal to the update, variable ($tag_formatted) to accumulate the text and (try to) append it to the attributes text.

Checking 'products_prid", I see that it is in the orders_products_attributes table as (for example) 18:fb94464ad775ca11c76ad2eef8eafc88, and there does not appear to be another usable reference to the product id in that table. Casting it to an integer (which I have done) should take care of it, and 18 is in the list of desired product ids.

For breakpoints, config.orderTagBuilder.php was operating, as when it was first uploaded it caused orderTagBuilder.php to be loaded and choke on the syntax errors, but when disabled by renaming to .bak, orderTagBuilder.php was ignored. Could there be a downside to loading orderTagBuilder at 0 instead of 10? What is the highest breakpoint you have ever seen used in stock ZC? Where does order.php get loaded? I couldn't find any mention of it in autoloaders. Does that mean that some code elsewhere tells it to load, at a place after all breakpoints? Perhaps in a page header? I'll look.

If v1.5.0 really doesn't support modifiable parameters, I'm dead in the water and what I am doing can never work. The calling notifier includes passing the $sql_data_array parameter as if it should be modifiable, and if it isn't that is cruelly misleading. I may have to recast this code as edits directly in order.php.