Install
npx skillscat add omninode-ai/omniclaude/plugins-onex-skills-hook-health-alert Install via the SkillsCat registry.
SKILL.md
Hook Health Alert
Fast Path — Node Dispatch
Dispatches to node_platform_diagnostics for the HOOK_HEALTH dimension:
onex run node_platform_diagnostics -- --dimensions=HOOK_HEALTHWith dry-run (reads cached artifacts, no live HTTP):
onex run node_platform_diagnostics -- --dimensions=HOOK_HEALTH --dry-runReturns ModelDiagnosticsResult with HOOK_HEALTH dimension status (PASS/WARN/FAIL),
error rate, actionable items.
Purpose
Periodic check of hook error rates. Queries the omnidash API for hook health
summary, evaluates against thresholds, and fires Slack alerts when tier 1
(interpreter) or tier 2 (degraded) errors exceed the configured threshold.
Designed as a skill-based interim solution. Will migrate to an ONEX effect node
(consuming onex.evt.omniclaude.hook-health-error.v1 directly) when the
runtime node system is operational.
Execution
- Query
GET /api/hook-health/summary?window={window}mfrom omnidash
(pending: omnidash endpoint not yet implemented; uses localhook_health_probeuntil then) - Evaluate:
- Tier 1 (interpreter) errors > 0: CRITICAL alert (always)
- Tier 2 (degraded) errors > threshold: WARNING alert
- Tier 3 (intentional): dashboard only, no alert
- Alert-channel liveness:
probe_hook_health()folds inomniclaude.hooks.alert_channel.probe_alert_channel(). A configured
channel that does not deliver setsalert_channel_status == "dead", makes
hook health unhealthy, and is reported on the durable failure log plus a
local (osascript / notify-send) notification — never through the dead
channel itself. Result is cached ~1h, so the check costs one round trip per
hour regardless of session count. Three states, not two:live,dead,not_configured.
- If alert needed and not --dry-run:
- Post to Slack via
SLACK_BOT_TOKEN/SLACK_CHANNEL_ID— the sole
channel (the incoming webhook is retired; no fallback) - Rate limit: one alert per stable alert identity per 30 minutes
- Alert identity =
{hook_name}:{error_tier}:{error_category} - Message format matches existing blocked_notifier.py Block Kit style
- Post to Slack via
- Log result to
.onex_state/hook-health/last-check.json
Alert Format
:red_circle: Hook Health CRITICAL
Interpreter errors detected (N in last 5m)
Hook: pre_tool_use_authorization_shim
Category: import_error
Message: ImportError: cannot import name 'UTC'...
Python: 3.9.6 (expected 3.12+)
Action: Rebuild plugin venv -- `cd plugins/onex/lib && uv sync`Scheduling
/hook-health-alert --schedule 5mThis creates a CronCreate job that runs the check every 5 minutes.