A hook stays unlisted on Unlisted until someone bonds $UNLST behind it. The bond is the listing: the hook page shows it, the router stops asking for the extra confirmation, and every swap routed through that hook pays the bonders. If the hook's code changes after the bond, anyone can slash half of it.

bond() records the hook's code hash and, for a proxy, its implementation address. slash(hook) is open to anyone: it compares both with the chain. If either changed, 50% of every bond on that hook is cut, 10% of it goes to the caller and 90% is burned.
Bonders earn from real routed volume on the hooks they trust. A busy hook with a clean score is the one people route through, so the bond follows the hooks that deserve it.
The score and the flags stay what the chain says. A bond lists a hook and pays its backers; it never raises a score or hides a warning.