@@ -476,6 +476,37 @@ func TestValidateHooksNormalizesEventNames(t *testing.T) {
476476 }
477477}
478478
479+func TestRunnerHookNameUsesDisplayName(t *testing.T) {
480+ t.Parallel()
481+
482+ t.Run("name field is used when set", func(t *testing.T) {
483+ t.Parallel()
484+ hookCfg := config.HookConfig{
485+ Name: "my-hook",
486+ Command: `echo '{"decision":"allow"}'`,
487+ }
488+ r := NewRunner([]config.HookConfig{hookCfg}, t.TempDir(), t.TempDir())
489+ result, err := r.Run(context.Background(), EventPreToolUse, "sess", "bash", `{}`)
490+ require.NoError(t, err)
491+ require.Equal(t, DecisionAllow, result.Decision)
492+ require.Len(t, result.Hooks, 1)
493+ require.Equal(t, "my-hook", result.Hooks[0].Name)
494+ })
495+
496+ t.Run("command is used when name is empty", func(t *testing.T) {
497+ t.Parallel()
498+ hookCfg := config.HookConfig{
499+ Command: `echo '{"decision":"allow"}'`,
500+ }
501+ r := NewRunner([]config.HookConfig{hookCfg}, t.TempDir(), t.TempDir())
502+ result, err := r.Run(context.Background(), EventPreToolUse, "sess", "bash", `{}`)
503+ require.NoError(t, err)
504+ require.Equal(t, DecisionAllow, result.Decision)
505+ require.Len(t, result.Hooks, 1)
506+ require.Equal(t, `echo '{"decision":"allow"}'`, result.Hooks[0].Name)
507+ })
508+}
509+
479510func TestRunnerParallelExecution(t *testing.T) {
480511 t.Parallel()
481512 // Two hooks: one allows, one denies. Deny should win.