luciq-alert-gaps
Find the metrics that matter, are currently unhealthy or material, and have no alert watching them — then propose alerts that close those gaps. A gap is the intersection of two facts pulled from Luciq MCP data: a metric is below a sensible bar, and no existing rule covers it. The skill won't recommend an alert for a healthy metric, or one that's already covered — that's just noise.
Use this skill when
The user asks whether they're missing alert coverage. "Am I missing any alerts?", "is anything unmonitored?"
The user asks what to alert on. "What should I be alerting on?", "recommend alerts".
The user just installed Luciq and wants a starting point. "I just installed Luciq — what alerts should I create?"
The user asks whether a specific degraded metric already has an alert on it.
Not for: reducing alerts that fire too often (use luciq-alert-noise), creating, changing, or managing one specific alert the user already has in mind (use luciq-alert-config), investigating why something crashed or hung (use luciq-debug), or first-time SDK install (use luciq-setup).
What the agent does
Coverage mapping. Reads every existing alert rule first, noting its type, trigger, and any entity it's scoped to, before evaluating anything else.
Health cross-referencing. Pulls current app-level and per-entity health from the Luciq MCP — crash-free rate, ANR, and per-endpoint/screen/launch/flow APM metrics — to know what's actually unhealthy right now.
Strict gap logic. Only calls something a gap when it's both uncovered by an existing rule and below a sensible health bar. A bad-but-already-covered metric isn't a gap; a healthy-but-uncovered metric isn't either.
Baseline-driven thresholds. Recommends alert thresholds from Luciq's baseline coverage table, not from the metric's current (often worse) value, so the alert still means something once the issue improves.
Approval before writing. Presents gaps to close, healthy metrics needing no alert, and already-covered metrics as three separate groups, and only creates alerts the user approves.
Install
The fastest path is the plugin install. Add the marketplace and install:
Works in Claude Code and Cursor. The plugin install also wires up the Luciq MCP server in one step.
After install, the skill is available as /luciq-skills:luciq-alert-gaps.
For other agents, install via npm:
Or copy SKILL.md from the public repo to ~/.claude/skills/luciq-alert-gaps/SKILL.md (user-global) or .claude/skills/luciq-alert-gaps/SKILL.md (project-local). The full SKILL.md is reproduced in the expandable below.
Prerequisites
The Luciq MCP server must be configured and authenticated. If the tools aren't available, the skill stops and directs the user to set up the MCP server, or run luciq-setup.
The skill uses these tools:
read_alerts
list
Existing alert rules — what's already covered, by type and trigger.
read_alerts
init
Per-app catalog of valid types, triggers, conditions, actions, and lookup IDs. Called before creating; also reveals what the app's plan and platform actually support.
app_insights
—
Top-level health: crash-free sessions and rate, ANR, OOM, app hangs, non-fatal crash count, bug totals, and whether APM has data.
apm_list_groups
—
Per-entity APM values — each network endpoint, launch, flow, screen, and frame-drop group with its apdex score, failure rate, and p95/p50.
write_alerts
create
Creates a recommended alert. State-changing — the agent confirms first.
Every "this is a gap" claim is grounded in a metric value the MCP actually returned and the absence of a matching rule — never recommended from a generic checklist alone.
If the alert tools aren't available, the skill stops and points the user to the Luciq MCP server setup, or to run luciq-setup.
What "good coverage" looks like
The skill carries a baseline of recommended alerts, used both as the reference for which metrics deserve an alert and as the threshold to set on any alert it creates. This baseline aligns with Luciq's predefined alerts — see that guide for the canonical recommended defaults:
Network
apdex
< 0.7
1 day
scope to key metrics / high-traffic endpoints
Network
failure_rate
> 10%
3 hours
scope to high-traffic endpoints
App launches
apdex
< 0.85
1 day
key launch metric
Flows
dropoff_rate
> 30%
1 day
end_reason in crashes / force_restarts
Screen loading
apdex
< 0.7
1 day
key screens
Screen rendering
apdex
< 0.7
1 day
key screens
Overall app
apdex (frustration-free sessions)
< 0.8
1 day
latest / top releases
Stability
crash_free_session / crash_free_users_overall
a target like 99%
—
the single most important safety net
Stability (Android)
anr_free_users_overall / anr_free_sessions_overall
a target like 99%
—
Android only
How the agent finds coverage gaps
Step 1. Read current coverage
The agent calls read_alerts with action: list and builds a map of what's already watched — for each existing rule, its type, trigger, and (where relevant) the entity it's scoped to, like a specific endpoint or screen.
Step 2. Read current health
The agent calls app_insights for the app-level picture — crash-free sessions and whether that's trending down, ANR/OOM/hang presence, and non-fatal crash volume — then calls apm_list_groups for each APM metric (network, launch, flows, screen loading, frame drop), sorted to surface the worst entities first. If the app has no data yet because it's a brand-new integration, the agent skips straight to proposing the standard baseline as proactive coverage.
Step 3. Compute the gaps
A metric only counts as a gap when both of these hold, checked in this order:
No existing rule covers it. If a rule of that type and trigger, scoped to that entity, already exists, the metric is covered — no matter how bad its current value is, it never becomes a gap.
It's below the bar from the baseline table above — for example, network apdex under 0.7, failure rate over 10%, or crash-free below its target.
Healthy metrics (above the bar) get no alert recommendation even if uncovered, and already-covered metrics get no duplicate even if currently bad. When a real gap needs a rule type the app's plan or platform doesn't support — ANR on iOS, for instance, or a plan-gated type missing from init — the agent still reports the gap and names the plan or platform requirement rather than silently dropping it.
Step 4. Present recommendations before creating anything
The agent presents three groups so the reasoning is visible: gaps to close (with the metric, its current value, why it's a gap, and the proposed alert), healthy metrics that need no alert, and metrics that are already covered. For a brand-new app, the first group is the baseline set proposed proactively. Nothing is written yet.
Step 5. Create approved alerts
For each recommendation the user approves, the agent calls read_alerts with action: init and builds the payload only from the types, triggers, conditions, and lookup IDs that response exposes for the app — if a recommended type or trigger isn't there, it surfaces that instead of forcing it. It then calls write_alerts with action: create and confirms each created alert back to the user. The same wire-format rules luciq-alert-config follows apply here: stringified operator codes, integer time-window keys, 0–1 decimal apdex thresholds for Overall app alerts, and p95/p50 thresholds in seconds.
Step 6. Pick a delivery channel
Every created alert needs an action, since one with none is silent. The agent defaults to send_email to the appropriate developers, or uses a forward action to a named tracking tool (Slack, Jira, PagerDuty, and similar) when the user specifies one.
Last updated