For the complete documentation index, see llms.txt. This page is also available as Markdown.

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.

📋 Click to expand the full SKILL.md

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:

Tool
Action
Purpose

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:

Area
Trigger
Threshold
Window
Notes

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:

  1. 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.

  2. 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