Per-HookConfig long-lived child. One executor owns one child
at a time; fires are serialized through a single connection
mutex (NDJSON request → NDJSON response). On framing error or
child exit, the connection is dropped and the next fire
reconnects with exponential backoff.
Subprocess-per-fire executor. Spawns a fresh child for every
event; closes stdin to signal “no more input”; reads stdout to
EOF and parses a single HookDecision.
Maps HookConfig → Arc<dyn HookExecutor>. Built once per
hooks.toml load (see src/hooks/config.rs::spawn_reload_task)
and held behind the same Arc<RwLock<…>> that owns the config
snapshot. G5’s chain runner consumes the registry’s outputs.