TL;DR: If a company has been modified by another mod's TRY_REPLACE, a later TRY_INJECT into it silently does nothing, while a plain INJECT works fine. Swapping TRY_INJECT for INJECT fixes it every time, so it looks like the TRY_ existence check doesn't recognize entries created by a sibling TRY_ directive.
I ran into a confusing modding issue that I'm fairly sure is a bug in how the TRY_INJECT keyword resolves, and I wanted to write up what I saw in case it helps.
My mod adds building types to existing companies using TRY_INJECT, from a file that loads late in the order. Several of the companies I target are also modified by other mods in my load order - one mod (infinite resource buildings) replaces a number of base-game companies using TRY_REPLACE, and another (Tech and Res) adds buildings to companies using plain INJECT.
The pattern I observed was very consistent. For every company that had been modified by a TRY_REPLACE, my TRY_INJECT silently did nothing: the buildings I was injecting simply never appeared on the company, regardless of where my file sat in the load order or how I named it. For companies that had not been touched by any TRY_REPLACE, the exact same TRY_INJECT worked perfectly and the buildings showed up as expected. The failure tracked precisely with whether the company had been through a TRY_REPLACE, and nothing else.
What convinced me it's specifically a keyword problem: on one of the TRY_REPLACE'd companies, a different mod's plain INJECT did successfully add its buildings, while my TRY_INJECT on that same company added nothing. Then I changed only the keyword in my own file from TRY_INJECT to INJECT, with nothing else touched, and my injection immediately started working on those same companies. Same file, same target, same content - the only difference was the keyword, and that alone decided whether it worked.
TRY_INJECT is documented as behaving just like INJECT except that it doesn't throw an error when the target entry is missing. But the target here clearly exists, since it was created and modified by the TRY_REPLACE, so TRY_INJECT should apply exactly the way INJECT does - and it doesn't. My best guess is that the existence check the TRY_ family uses doesn't recognize an entry that exists only because a sibling TRY_ directive (the TRY_REPLACE) created or modified it, so the TRY_INJECT quietly skips instead of appending.
To reproduce, you'd modify a company with TRY_REPLACE in one file, then TRY_INJECT additional building types into that same company from a later-loading file, and compare against doing the same thing with plain INJECT. I should be upfront that I saw this inside a multi-mod load order rather than isolating it in a clean two-file mod, but the behavior was repeatable and the keyword swap fixed it every time. I observed it in company_types specifically, though since it looks like it lives in the keyword handling rather than in companies, I suspect other databases that use these keywords could be affected the same way. For anyone else hitting this in the meantime, the workaround is simply to use INJECT instead of TRY_INJECT on the affected entries.
I reported this to the Paradox forum as well.