They were right and my REQ-155 fix was half a fix. _is_prd_hook_group classified whole GROUPS: if any hook in a group ran prd_hook_dispatch the group was ours and got replaced wholesale. Codex allows a group's hooks array to hold several entries, and their UserPromptSubmit group held the dispatcher AND the Fabric hook - so the fix deleted it a second time.

My original test only ever built a group containing nothing but the foreign hook, which is why it passed. That is the actual defect: I tested the shape that could not fail.

Reproduced their exact case before changing anything - one group holding both entries, Fabric hook gone. Now classified per ENTRY: _is_prd_hook_entry plus _strip_prd_entries, which returns None for a group left with no hooks so an empty group is not carried. Re-run on their scenario: dry-run reports preserved=1 (what they asked for), the Fabric hook survives exactly once, the plugin entry is refreshed exactly once, and the mixed group is split into two clean groups.
