[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-launchdarkly-metric-choose":3,"mdc-d0q0mw-key":37,"related-repo-launchdarkly-launchdarkly-metric-choose":982,"related-org-launchdarkly-launchdarkly-metric-choose":1066},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":32,"sourceUrl":35,"mdContent":36},"launchdarkly-metric-choose","select metrics for feature experiments","Choose the right metrics for a LaunchDarkly experiment, guarded rollout, or release policy. Use when the user wants to know which metrics to use, which is the primary metric for an experiment, what guardrails to add, or which events to monitor in a rollout. Surfaces what will auto-attach from existing release policies before making additional recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"launchdarkly","LaunchDarkly","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Flaunchdarkly.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Analytics","analytics","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Metrics","metrics",{"name":21,"slug":22,"type":15},"A\u002FB Testing","a-b-testing",20,"https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling","2026-05-15T06:19:38.213157","Apache-2.0",6,[29,30,31],"agent-skills","launchdarkly-ai","managed-by-terraform",{"repoUrl":24,"stars":23,"forks":27,"topics":33,"description":34},[29,30,31],"LaunchDarkly's official AI tooling","https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling\u002Ftree\u002FHEAD\u002Fskills\u002Fmetrics\u002Flaunchdarkly-metric-choose","---\nname: launchdarkly-metric-choose\ndescription: \"Choose the right metrics for a LaunchDarkly experiment, guarded rollout, or release policy. Use when the user wants to know which metrics to use, which is the primary metric for an experiment, what guardrails to add, or which events to monitor in a rollout. Surfaces what will auto-attach from existing release policies before making additional recommendations.\"\nlicense: Apache-2.0\ncompatibility: Requires the remotely hosted LaunchDarkly MCP server\nmetadata:\n  author: launchdarkly\n  version: \"1.0.0-experimental\"\n---\n\n# LaunchDarkly Metric Choose\n\nYou're using a skill that helps users select the right metrics before setting up an experiment, guarded rollout, or release policy. Your job is to understand the feature context, surface what will auto-attach from existing project policies, inventory what's available and healthy, and produce a clear typed recommendation.\n\nThis skill is advisory. It does not create metrics, attach them to experiments, or configure rollouts. For those tasks, see the related skills at the end of this document.\n\n## Prerequisites\n\nThis skill requires the remotely hosted LaunchDarkly MCP server to be configured in your environment.\n\n**Required MCP tools:**\n- `list-metrics` — inventory available metrics with their types and event keys\n- `list-metric-events` — check which event keys have recent activity\n\n**Optional MCP tools (enhance workflow):**\n- `list-release-policies` — fetch project-level policies that configure which metrics auto-attach to guarded rollouts. Use this for the guarded rollout and release policy paths.\n\n## Workflow\n\n### Step 1: Identify the Context\n\nAsk two questions upfront:\n\n1. **What is this for?**\n   - **(a) Experiment** — testing a hypothesis with a flag variant\n   - **(b) Guarded rollout** — progressively rolling out a change with automatic regression detection\n   - **(c) Release policy** — creating or editing a project-wide policy that configures default metrics for all guarded rollouts matching certain conditions\n\n2. **What is the change?**\n   - Flag key (if applicable)\n   - Plain-language description: \"Rolling out a new checkout flow\" \u002F \"Testing a new recommendation algorithm\"\n\n### Step 2: Fetch Existing Configuration (Guarded Rollout and Release Policy only)\n\n**For experiments — skip this step.** There is no pre-existing configuration to surface.\n\n**For guarded rollouts and release policy work**, call `list-release-policies` first:\n\n```\nlist-release-policies(projectKey)\n```\n\nSurface the results before making any recommendations:\n\n```\nYour project has 2 release policies:\n\nPolicy: \"Production guardrails\" (applies to: environment=production)\n  Auto-attaches to guarded rollouts:\n    ✓ api-error-rate  (count, LowerThanBaseline)\n    ✓ p95-latency     (value, LowerThanBaseline)\n    ✓ [Metric group] Core Platform Health (3 metrics)\n\nPolicy: \"Default\" (applies to: all environments)\n  No metrics configured.\n```\n\nThis tells the user what's already covered before they choose anything additional. For a guarded rollout, these metrics will appear automatically — the recommendation is about what to add on top, not rebuild from scratch.\n\nIf no policies exist or none have metrics configured, note that all metrics must be selected manually.\n\n### Step 3: Inventory Available Metrics with Event Health\n\nCall `list-metrics` to see all metrics in the project, then cross-reference with `list-metric-events`.\n\nOrganize into two groups:\n\n| Group | Criteria | Note |\n|-------|----------|------|\n| **Healthy** | Event key appears in `list-metric-events` | Safe to recommend |\n| **At-risk** | Event key absent from `list-metric-events` | Warn: may not produce data |\n\nShow this inventory before recommending — it may reveal that a metric the user has in mind has no events flowing.\n\n### Step 4: Recommend\n\nThe reasoning differs meaningfully by context.\n\n---\n\n#### (a) Experiment\n\n**Start with the hypothesis, not the metric list.**\n\nAsk the user to complete this sentence before looking at available metrics:\n\n> \"If this change succeeds, [metric] will [increase \u002F decrease].\"\n\nThe primary metric must directly measure that hypothesis — not a proxy, not a correlation. If the user can't complete the sentence, help them get there first.\n\n**Propose one primary metric.** It must:\n- Directly measure the hypothesis\n- Have events actively flowing\n- Have an unambiguous success direction (`HigherThanBaseline` or `LowerThanBaseline`)\n\n**Propose typed secondary metrics.** Suggest at least one of each type that applies:\n\n| Type | Purpose | Example |\n|------|---------|---------|\n| **Guardrail** | Did the change break anything? | Error rate, crash rate, latency p95 |\n| **Counter-metric** | Did A improve at the cost of B? | If primary is conversion, add support tickets or session length |\n| **Supporting signal** | Does correlated behavior confirm the hypothesis? | If primary is signup, add onboarding step 2 completion |\n\nOne of each type is usually the right amount. More secondary metrics add noise and interpretation burden.\n\n---\n\n#### (b) Guarded Rollout\n\nGuarded rollouts are safety mechanisms, not experiments. Each metric you add is a potential automatic rollback trigger — if it regresses beyond its threshold before the rollout completes, LaunchDarkly can stop and revert the release.\n\n**Start from what auto-attaches.** After surfacing the release policy results in Step 2, ask: \"Are the auto-attached metrics enough, or do you want to add more for this specific rollout?\"\n\n**When recommending additional metrics:**\n- Bias toward reliability — engineering metrics (error rate, latency, crash rate) with stable, predictable baselines\n- Avoid exploratory product metrics that are noisy or hard to interpret under regression analysis\n- **Fewer is better.** Two or three high-signal metrics is the right size. More than five creates false positive rollback risk.\n- **Only recommend metrics with events actively flowing.** An at-risk metric in a guarded rollout either produces no signal or, worse, triggers a false rollback due to data quality issues, not a real regression.\n\nSuggested starting point for any guarded rollout (if not already covered by a policy):\n1. Error rate — are we seeing more errors in the new variation?\n2. Latency \u002F response time — is the new variation slower?\n3. One domain-specific metric tied to the core user action the change affects\n\n---\n\n#### (c) Release Policy\n\nRelease policies apply to every rollout in the project that matches their conditions. This is the highest bar.\n\n**Start from the current state.** After surfacing existing policies in Step 2, ask: \"Which policy are you editing, or do you want to create a new one? What environments or flag conditions will it apply to?\"\n\n**When recommending metrics for a policy:**\n- **2–3 metrics maximum.** More than that turns the policy into a burden on every rollout, including ones where the metrics don't apply well.\n- **Only recommend metrics with a long, stable event history.** If an event has been flowing reliably for months, it's a safe project-wide default. Occasional gaps will create problems at scale.\n- **Push back on additions.** If the user proposes more than 3, ask which ones they'd remove. The discipline of choosing is the point.\n- **Explain scope conditions.** A policy scoped to `environment=production` only applies to production rollouts. Help the user think through whether they want the same metrics in staging (where baselines may differ) or a separate policy.\n\nTypical strong policy candidates: error rate, a core conversion or engagement metric, latency.\n\n### Step 5: Deliver the Recommendation\n\nOutput a clear, named list. Be explicit about what each metric is for and what's already covered:\n\n```\nRecommended metrics for: new checkout flow guarded rollout (environment: production)\n\nAUTO-ATTACHED (from \"Production guardrails\" policy):\n  ✓ api-error-rate    (count, LowerThanBaseline)\n  ✓ p95-latency       (value, LowerThanBaseline)\n\nADDITIONAL — recommended for this rollout:\n  ✓ checkout-conversion  (occurrence, HigherThanBaseline)\n    → Confirms the rollout isn't degrading the core conversion the feature targets\n\n⚠ page-load-time — no recent events. Instrument the event before including it,\n  or remove it from the list to avoid a false rollback trigger.\n```\n\nThen close with next steps:\n- If a metric the user needs doesn't exist → use the **metric-create** skill\n- If an event isn't flowing → use the **metric-instrument** skill\n- Once the list is confirmed → configure the guarded rollout or experiment (via the LaunchDarkly UI or API)\n\n## Important Context\n\n- **Mid-experiment metric changes require a restart.** LaunchDarkly snapshots the metric configuration when an experiment starts. Adding, removing, or changing metrics after launch requires stopping the experiment and restarting it — historical data from before the change is not comparable. Raise this immediately if the user mentions they're mid-experiment.\n- **A primary metric with no events is worse than no primary metric.** The experiment produces no statistical output. Event health is a hard requirement for the primary metric.\n- **CUPED and percentile analysis are incompatible.** If the experiment uses CUPED variance reduction, percentile-based metrics (e.g. p95 latency) silently degrade to mean-based analysis. Flag this if the user selects a percentile metric in a CUPED-enabled experiment.\n- **Context kind mismatches cause missing data.** If the metric event is tracked with a `device` context but the experiment randomizes on `user`, the event won't be attributed correctly. Confirm that the context kind in `track()` calls matches the experiment's randomization unit.\n- **Release policy metrics must share the same context kind.** All metrics in a guarded rollout release policy must use the same randomization unit. If the user proposes metrics with mismatched context kinds, flag it before they try to configure the policy.\n\n## Related Skills\n\n- [`launchdarkly-metric-create`](..\u002Flaunchdarkly-metric-create\u002FSKILL.md) — create a metric that doesn't exist yet\n- [`launchdarkly-metric-instrument`](..\u002Flaunchdarkly-metric-instrument\u002FSKILL.md) — add a `track()` call so events start flowing\n",{"data":38,"body":42},{"name":4,"description":6,"license":26,"compatibility":39,"metadata":40},"Requires the remotely hosted LaunchDarkly MCP server",{"author":8,"version":41},"1.0.0-experimental",{"type":43,"children":44},"root",[45,53,59,64,71,76,85,113,121,135,141,148,153,219,225,235,252,264,269,278,283,288,294,313,318,403,408,414,419,423,429,437,442,466,471,481,515,525,615,620,623,629,634,644,652,685,690,708,711,717,722,732,740,791,796,802,807,816,821,852,858,935,941],{"type":46,"tag":47,"props":48,"children":49},"element","h1",{"id":4},[50],{"type":51,"value":52},"text","LaunchDarkly Metric Choose",{"type":46,"tag":54,"props":55,"children":56},"p",{},[57],{"type":51,"value":58},"You're using a skill that helps users select the right metrics before setting up an experiment, guarded rollout, or release policy. Your job is to understand the feature context, surface what will auto-attach from existing project policies, inventory what's available and healthy, and produce a clear typed recommendation.",{"type":46,"tag":54,"props":60,"children":61},{},[62],{"type":51,"value":63},"This skill is advisory. It does not create metrics, attach them to experiments, or configure rollouts. For those tasks, see the related skills at the end of this document.",{"type":46,"tag":65,"props":66,"children":68},"h2",{"id":67},"prerequisites",[69],{"type":51,"value":70},"Prerequisites",{"type":46,"tag":54,"props":72,"children":73},{},[74],{"type":51,"value":75},"This skill requires the remotely hosted LaunchDarkly MCP server to be configured in your environment.",{"type":46,"tag":54,"props":77,"children":78},{},[79],{"type":46,"tag":80,"props":81,"children":82},"strong",{},[83],{"type":51,"value":84},"Required MCP tools:",{"type":46,"tag":86,"props":87,"children":88},"ul",{},[89,102],{"type":46,"tag":90,"props":91,"children":92},"li",{},[93,100],{"type":46,"tag":94,"props":95,"children":97},"code",{"className":96},[],[98],{"type":51,"value":99},"list-metrics",{"type":51,"value":101}," — inventory available metrics with their types and event keys",{"type":46,"tag":90,"props":103,"children":104},{},[105,111],{"type":46,"tag":94,"props":106,"children":108},{"className":107},[],[109],{"type":51,"value":110},"list-metric-events",{"type":51,"value":112}," — check which event keys have recent activity",{"type":46,"tag":54,"props":114,"children":115},{},[116],{"type":46,"tag":80,"props":117,"children":118},{},[119],{"type":51,"value":120},"Optional MCP tools (enhance workflow):",{"type":46,"tag":86,"props":122,"children":123},{},[124],{"type":46,"tag":90,"props":125,"children":126},{},[127,133],{"type":46,"tag":94,"props":128,"children":130},{"className":129},[],[131],{"type":51,"value":132},"list-release-policies",{"type":51,"value":134}," — fetch project-level policies that configure which metrics auto-attach to guarded rollouts. Use this for the guarded rollout and release policy paths.",{"type":46,"tag":65,"props":136,"children":138},{"id":137},"workflow",[139],{"type":51,"value":140},"Workflow",{"type":46,"tag":142,"props":143,"children":145},"h3",{"id":144},"step-1-identify-the-context",[146],{"type":51,"value":147},"Step 1: Identify the Context",{"type":46,"tag":54,"props":149,"children":150},{},[151],{"type":51,"value":152},"Ask two questions upfront:",{"type":46,"tag":154,"props":155,"children":156},"ol",{},[157,198],{"type":46,"tag":90,"props":158,"children":159},{},[160,165],{"type":46,"tag":80,"props":161,"children":162},{},[163],{"type":51,"value":164},"What is this for?",{"type":46,"tag":86,"props":166,"children":167},{},[168,178,188],{"type":46,"tag":90,"props":169,"children":170},{},[171,176],{"type":46,"tag":80,"props":172,"children":173},{},[174],{"type":51,"value":175},"(a) Experiment",{"type":51,"value":177}," — testing a hypothesis with a flag variant",{"type":46,"tag":90,"props":179,"children":180},{},[181,186],{"type":46,"tag":80,"props":182,"children":183},{},[184],{"type":51,"value":185},"(b) Guarded rollout",{"type":51,"value":187}," — progressively rolling out a change with automatic regression detection",{"type":46,"tag":90,"props":189,"children":190},{},[191,196],{"type":46,"tag":80,"props":192,"children":193},{},[194],{"type":51,"value":195},"(c) Release policy",{"type":51,"value":197}," — creating or editing a project-wide policy that configures default metrics for all guarded rollouts matching certain conditions",{"type":46,"tag":90,"props":199,"children":200},{},[201,206],{"type":46,"tag":80,"props":202,"children":203},{},[204],{"type":51,"value":205},"What is the change?",{"type":46,"tag":86,"props":207,"children":208},{},[209,214],{"type":46,"tag":90,"props":210,"children":211},{},[212],{"type":51,"value":213},"Flag key (if applicable)",{"type":46,"tag":90,"props":215,"children":216},{},[217],{"type":51,"value":218},"Plain-language description: \"Rolling out a new checkout flow\" \u002F \"Testing a new recommendation algorithm\"",{"type":46,"tag":142,"props":220,"children":222},{"id":221},"step-2-fetch-existing-configuration-guarded-rollout-and-release-policy-only",[223],{"type":51,"value":224},"Step 2: Fetch Existing Configuration (Guarded Rollout and Release Policy only)",{"type":46,"tag":54,"props":226,"children":227},{},[228,233],{"type":46,"tag":80,"props":229,"children":230},{},[231],{"type":51,"value":232},"For experiments — skip this step.",{"type":51,"value":234}," There is no pre-existing configuration to surface.",{"type":46,"tag":54,"props":236,"children":237},{},[238,243,245,250],{"type":46,"tag":80,"props":239,"children":240},{},[241],{"type":51,"value":242},"For guarded rollouts and release policy work",{"type":51,"value":244},", call ",{"type":46,"tag":94,"props":246,"children":248},{"className":247},[],[249],{"type":51,"value":132},{"type":51,"value":251}," first:",{"type":46,"tag":253,"props":254,"children":258},"pre",{"className":255,"code":257,"language":51},[256],"language-text","list-release-policies(projectKey)\n",[259],{"type":46,"tag":94,"props":260,"children":262},{"__ignoreMap":261},"",[263],{"type":51,"value":257},{"type":46,"tag":54,"props":265,"children":266},{},[267],{"type":51,"value":268},"Surface the results before making any recommendations:",{"type":46,"tag":253,"props":270,"children":273},{"className":271,"code":272,"language":51},[256],"Your project has 2 release policies:\n\nPolicy: \"Production guardrails\" (applies to: environment=production)\n  Auto-attaches to guarded rollouts:\n    ✓ api-error-rate  (count, LowerThanBaseline)\n    ✓ p95-latency     (value, LowerThanBaseline)\n    ✓ [Metric group] Core Platform Health (3 metrics)\n\nPolicy: \"Default\" (applies to: all environments)\n  No metrics configured.\n",[274],{"type":46,"tag":94,"props":275,"children":276},{"__ignoreMap":261},[277],{"type":51,"value":272},{"type":46,"tag":54,"props":279,"children":280},{},[281],{"type":51,"value":282},"This tells the user what's already covered before they choose anything additional. For a guarded rollout, these metrics will appear automatically — the recommendation is about what to add on top, not rebuild from scratch.",{"type":46,"tag":54,"props":284,"children":285},{},[286],{"type":51,"value":287},"If no policies exist or none have metrics configured, note that all metrics must be selected manually.",{"type":46,"tag":142,"props":289,"children":291},{"id":290},"step-3-inventory-available-metrics-with-event-health",[292],{"type":51,"value":293},"Step 3: Inventory Available Metrics with Event Health",{"type":46,"tag":54,"props":295,"children":296},{},[297,299,304,306,311],{"type":51,"value":298},"Call ",{"type":46,"tag":94,"props":300,"children":302},{"className":301},[],[303],{"type":51,"value":99},{"type":51,"value":305}," to see all metrics in the project, then cross-reference with ",{"type":46,"tag":94,"props":307,"children":309},{"className":308},[],[310],{"type":51,"value":110},{"type":51,"value":312},".",{"type":46,"tag":54,"props":314,"children":315},{},[316],{"type":51,"value":317},"Organize into two groups:",{"type":46,"tag":319,"props":320,"children":321},"table",{},[322,346],{"type":46,"tag":323,"props":324,"children":325},"thead",{},[326],{"type":46,"tag":327,"props":328,"children":329},"tr",{},[330,336,341],{"type":46,"tag":331,"props":332,"children":333},"th",{},[334],{"type":51,"value":335},"Group",{"type":46,"tag":331,"props":337,"children":338},{},[339],{"type":51,"value":340},"Criteria",{"type":46,"tag":331,"props":342,"children":343},{},[344],{"type":51,"value":345},"Note",{"type":46,"tag":347,"props":348,"children":349},"tbody",{},[350,377],{"type":46,"tag":327,"props":351,"children":352},{},[353,362,372],{"type":46,"tag":354,"props":355,"children":356},"td",{},[357],{"type":46,"tag":80,"props":358,"children":359},{},[360],{"type":51,"value":361},"Healthy",{"type":46,"tag":354,"props":363,"children":364},{},[365,367],{"type":51,"value":366},"Event key appears in ",{"type":46,"tag":94,"props":368,"children":370},{"className":369},[],[371],{"type":51,"value":110},{"type":46,"tag":354,"props":373,"children":374},{},[375],{"type":51,"value":376},"Safe to recommend",{"type":46,"tag":327,"props":378,"children":379},{},[380,388,398],{"type":46,"tag":354,"props":381,"children":382},{},[383],{"type":46,"tag":80,"props":384,"children":385},{},[386],{"type":51,"value":387},"At-risk",{"type":46,"tag":354,"props":389,"children":390},{},[391,393],{"type":51,"value":392},"Event key absent from ",{"type":46,"tag":94,"props":394,"children":396},{"className":395},[],[397],{"type":51,"value":110},{"type":46,"tag":354,"props":399,"children":400},{},[401],{"type":51,"value":402},"Warn: may not produce data",{"type":46,"tag":54,"props":404,"children":405},{},[406],{"type":51,"value":407},"Show this inventory before recommending — it may reveal that a metric the user has in mind has no events flowing.",{"type":46,"tag":142,"props":409,"children":411},{"id":410},"step-4-recommend",[412],{"type":51,"value":413},"Step 4: Recommend",{"type":46,"tag":54,"props":415,"children":416},{},[417],{"type":51,"value":418},"The reasoning differs meaningfully by context.",{"type":46,"tag":420,"props":421,"children":422},"hr",{},[],{"type":46,"tag":424,"props":425,"children":427},"h4",{"id":426},"a-experiment",[428],{"type":51,"value":175},{"type":46,"tag":54,"props":430,"children":431},{},[432],{"type":46,"tag":80,"props":433,"children":434},{},[435],{"type":51,"value":436},"Start with the hypothesis, not the metric list.",{"type":46,"tag":54,"props":438,"children":439},{},[440],{"type":51,"value":441},"Ask the user to complete this sentence before looking at available metrics:",{"type":46,"tag":443,"props":444,"children":445},"blockquote",{},[446],{"type":46,"tag":54,"props":447,"children":448},{},[449,451,457,459,464],{"type":51,"value":450},"\"If this change succeeds, ",{"type":46,"tag":452,"props":453,"children":454},"span",{},[455],{"type":51,"value":456},"metric",{"type":51,"value":458}," will ",{"type":46,"tag":452,"props":460,"children":461},{},[462],{"type":51,"value":463},"increase \u002F decrease",{"type":51,"value":465},".\"",{"type":46,"tag":54,"props":467,"children":468},{},[469],{"type":51,"value":470},"The primary metric must directly measure that hypothesis — not a proxy, not a correlation. If the user can't complete the sentence, help them get there first.",{"type":46,"tag":54,"props":472,"children":473},{},[474,479],{"type":46,"tag":80,"props":475,"children":476},{},[477],{"type":51,"value":478},"Propose one primary metric.",{"type":51,"value":480}," It must:",{"type":46,"tag":86,"props":482,"children":483},{},[484,489,494],{"type":46,"tag":90,"props":485,"children":486},{},[487],{"type":51,"value":488},"Directly measure the hypothesis",{"type":46,"tag":90,"props":490,"children":491},{},[492],{"type":51,"value":493},"Have events actively flowing",{"type":46,"tag":90,"props":495,"children":496},{},[497,499,505,507,513],{"type":51,"value":498},"Have an unambiguous success direction (",{"type":46,"tag":94,"props":500,"children":502},{"className":501},[],[503],{"type":51,"value":504},"HigherThanBaseline",{"type":51,"value":506}," or ",{"type":46,"tag":94,"props":508,"children":510},{"className":509},[],[511],{"type":51,"value":512},"LowerThanBaseline",{"type":51,"value":514},")",{"type":46,"tag":54,"props":516,"children":517},{},[518,523],{"type":46,"tag":80,"props":519,"children":520},{},[521],{"type":51,"value":522},"Propose typed secondary metrics.",{"type":51,"value":524}," Suggest at least one of each type that applies:",{"type":46,"tag":319,"props":526,"children":527},{},[528,549],{"type":46,"tag":323,"props":529,"children":530},{},[531],{"type":46,"tag":327,"props":532,"children":533},{},[534,539,544],{"type":46,"tag":331,"props":535,"children":536},{},[537],{"type":51,"value":538},"Type",{"type":46,"tag":331,"props":540,"children":541},{},[542],{"type":51,"value":543},"Purpose",{"type":46,"tag":331,"props":545,"children":546},{},[547],{"type":51,"value":548},"Example",{"type":46,"tag":347,"props":550,"children":551},{},[552,573,594],{"type":46,"tag":327,"props":553,"children":554},{},[555,563,568],{"type":46,"tag":354,"props":556,"children":557},{},[558],{"type":46,"tag":80,"props":559,"children":560},{},[561],{"type":51,"value":562},"Guardrail",{"type":46,"tag":354,"props":564,"children":565},{},[566],{"type":51,"value":567},"Did the change break anything?",{"type":46,"tag":354,"props":569,"children":570},{},[571],{"type":51,"value":572},"Error rate, crash rate, latency p95",{"type":46,"tag":327,"props":574,"children":575},{},[576,584,589],{"type":46,"tag":354,"props":577,"children":578},{},[579],{"type":46,"tag":80,"props":580,"children":581},{},[582],{"type":51,"value":583},"Counter-metric",{"type":46,"tag":354,"props":585,"children":586},{},[587],{"type":51,"value":588},"Did A improve at the cost of B?",{"type":46,"tag":354,"props":590,"children":591},{},[592],{"type":51,"value":593},"If primary is conversion, add support tickets or session length",{"type":46,"tag":327,"props":595,"children":596},{},[597,605,610],{"type":46,"tag":354,"props":598,"children":599},{},[600],{"type":46,"tag":80,"props":601,"children":602},{},[603],{"type":51,"value":604},"Supporting signal",{"type":46,"tag":354,"props":606,"children":607},{},[608],{"type":51,"value":609},"Does correlated behavior confirm the hypothesis?",{"type":46,"tag":354,"props":611,"children":612},{},[613],{"type":51,"value":614},"If primary is signup, add onboarding step 2 completion",{"type":46,"tag":54,"props":616,"children":617},{},[618],{"type":51,"value":619},"One of each type is usually the right amount. More secondary metrics add noise and interpretation burden.",{"type":46,"tag":420,"props":621,"children":622},{},[],{"type":46,"tag":424,"props":624,"children":626},{"id":625},"b-guarded-rollout",[627],{"type":51,"value":628},"(b) Guarded Rollout",{"type":46,"tag":54,"props":630,"children":631},{},[632],{"type":51,"value":633},"Guarded rollouts are safety mechanisms, not experiments. Each metric you add is a potential automatic rollback trigger — if it regresses beyond its threshold before the rollout completes, LaunchDarkly can stop and revert the release.",{"type":46,"tag":54,"props":635,"children":636},{},[637,642],{"type":46,"tag":80,"props":638,"children":639},{},[640],{"type":51,"value":641},"Start from what auto-attaches.",{"type":51,"value":643}," After surfacing the release policy results in Step 2, ask: \"Are the auto-attached metrics enough, or do you want to add more for this specific rollout?\"",{"type":46,"tag":54,"props":645,"children":646},{},[647],{"type":46,"tag":80,"props":648,"children":649},{},[650],{"type":51,"value":651},"When recommending additional metrics:",{"type":46,"tag":86,"props":653,"children":654},{},[655,660,665,675],{"type":46,"tag":90,"props":656,"children":657},{},[658],{"type":51,"value":659},"Bias toward reliability — engineering metrics (error rate, latency, crash rate) with stable, predictable baselines",{"type":46,"tag":90,"props":661,"children":662},{},[663],{"type":51,"value":664},"Avoid exploratory product metrics that are noisy or hard to interpret under regression analysis",{"type":46,"tag":90,"props":666,"children":667},{},[668,673],{"type":46,"tag":80,"props":669,"children":670},{},[671],{"type":51,"value":672},"Fewer is better.",{"type":51,"value":674}," Two or three high-signal metrics is the right size. More than five creates false positive rollback risk.",{"type":46,"tag":90,"props":676,"children":677},{},[678,683],{"type":46,"tag":80,"props":679,"children":680},{},[681],{"type":51,"value":682},"Only recommend metrics with events actively flowing.",{"type":51,"value":684}," An at-risk metric in a guarded rollout either produces no signal or, worse, triggers a false rollback due to data quality issues, not a real regression.",{"type":46,"tag":54,"props":686,"children":687},{},[688],{"type":51,"value":689},"Suggested starting point for any guarded rollout (if not already covered by a policy):",{"type":46,"tag":154,"props":691,"children":692},{},[693,698,703],{"type":46,"tag":90,"props":694,"children":695},{},[696],{"type":51,"value":697},"Error rate — are we seeing more errors in the new variation?",{"type":46,"tag":90,"props":699,"children":700},{},[701],{"type":51,"value":702},"Latency \u002F response time — is the new variation slower?",{"type":46,"tag":90,"props":704,"children":705},{},[706],{"type":51,"value":707},"One domain-specific metric tied to the core user action the change affects",{"type":46,"tag":420,"props":709,"children":710},{},[],{"type":46,"tag":424,"props":712,"children":714},{"id":713},"c-release-policy",[715],{"type":51,"value":716},"(c) Release Policy",{"type":46,"tag":54,"props":718,"children":719},{},[720],{"type":51,"value":721},"Release policies apply to every rollout in the project that matches their conditions. This is the highest bar.",{"type":46,"tag":54,"props":723,"children":724},{},[725,730],{"type":46,"tag":80,"props":726,"children":727},{},[728],{"type":51,"value":729},"Start from the current state.",{"type":51,"value":731}," After surfacing existing policies in Step 2, ask: \"Which policy are you editing, or do you want to create a new one? What environments or flag conditions will it apply to?\"",{"type":46,"tag":54,"props":733,"children":734},{},[735],{"type":46,"tag":80,"props":736,"children":737},{},[738],{"type":51,"value":739},"When recommending metrics for a policy:",{"type":46,"tag":86,"props":741,"children":742},{},[743,753,763,773],{"type":46,"tag":90,"props":744,"children":745},{},[746,751],{"type":46,"tag":80,"props":747,"children":748},{},[749],{"type":51,"value":750},"2–3 metrics maximum.",{"type":51,"value":752}," More than that turns the policy into a burden on every rollout, including ones where the metrics don't apply well.",{"type":46,"tag":90,"props":754,"children":755},{},[756,761],{"type":46,"tag":80,"props":757,"children":758},{},[759],{"type":51,"value":760},"Only recommend metrics with a long, stable event history.",{"type":51,"value":762}," If an event has been flowing reliably for months, it's a safe project-wide default. Occasional gaps will create problems at scale.",{"type":46,"tag":90,"props":764,"children":765},{},[766,771],{"type":46,"tag":80,"props":767,"children":768},{},[769],{"type":51,"value":770},"Push back on additions.",{"type":51,"value":772}," If the user proposes more than 3, ask which ones they'd remove. The discipline of choosing is the point.",{"type":46,"tag":90,"props":774,"children":775},{},[776,781,783,789],{"type":46,"tag":80,"props":777,"children":778},{},[779],{"type":51,"value":780},"Explain scope conditions.",{"type":51,"value":782}," A policy scoped to ",{"type":46,"tag":94,"props":784,"children":786},{"className":785},[],[787],{"type":51,"value":788},"environment=production",{"type":51,"value":790}," only applies to production rollouts. Help the user think through whether they want the same metrics in staging (where baselines may differ) or a separate policy.",{"type":46,"tag":54,"props":792,"children":793},{},[794],{"type":51,"value":795},"Typical strong policy candidates: error rate, a core conversion or engagement metric, latency.",{"type":46,"tag":142,"props":797,"children":799},{"id":798},"step-5-deliver-the-recommendation",[800],{"type":51,"value":801},"Step 5: Deliver the Recommendation",{"type":46,"tag":54,"props":803,"children":804},{},[805],{"type":51,"value":806},"Output a clear, named list. Be explicit about what each metric is for and what's already covered:",{"type":46,"tag":253,"props":808,"children":811},{"className":809,"code":810,"language":51},[256],"Recommended metrics for: new checkout flow guarded rollout (environment: production)\n\nAUTO-ATTACHED (from \"Production guardrails\" policy):\n  ✓ api-error-rate    (count, LowerThanBaseline)\n  ✓ p95-latency       (value, LowerThanBaseline)\n\nADDITIONAL — recommended for this rollout:\n  ✓ checkout-conversion  (occurrence, HigherThanBaseline)\n    → Confirms the rollout isn't degrading the core conversion the feature targets\n\n⚠ page-load-time — no recent events. Instrument the event before including it,\n  or remove it from the list to avoid a false rollback trigger.\n",[812],{"type":46,"tag":94,"props":813,"children":814},{"__ignoreMap":261},[815],{"type":51,"value":810},{"type":46,"tag":54,"props":817,"children":818},{},[819],{"type":51,"value":820},"Then close with next steps:",{"type":46,"tag":86,"props":822,"children":823},{},[824,836,847],{"type":46,"tag":90,"props":825,"children":826},{},[827,829,834],{"type":51,"value":828},"If a metric the user needs doesn't exist → use the ",{"type":46,"tag":80,"props":830,"children":831},{},[832],{"type":51,"value":833},"metric-create",{"type":51,"value":835}," skill",{"type":46,"tag":90,"props":837,"children":838},{},[839,841,846],{"type":51,"value":840},"If an event isn't flowing → use the ",{"type":46,"tag":80,"props":842,"children":843},{},[844],{"type":51,"value":845},"metric-instrument",{"type":51,"value":835},{"type":46,"tag":90,"props":848,"children":849},{},[850],{"type":51,"value":851},"Once the list is confirmed → configure the guarded rollout or experiment (via the LaunchDarkly UI or API)",{"type":46,"tag":65,"props":853,"children":855},{"id":854},"important-context",[856],{"type":51,"value":857},"Important Context",{"type":46,"tag":86,"props":859,"children":860},{},[861,871,881,891,925],{"type":46,"tag":90,"props":862,"children":863},{},[864,869],{"type":46,"tag":80,"props":865,"children":866},{},[867],{"type":51,"value":868},"Mid-experiment metric changes require a restart.",{"type":51,"value":870}," LaunchDarkly snapshots the metric configuration when an experiment starts. Adding, removing, or changing metrics after launch requires stopping the experiment and restarting it — historical data from before the change is not comparable. Raise this immediately if the user mentions they're mid-experiment.",{"type":46,"tag":90,"props":872,"children":873},{},[874,879],{"type":46,"tag":80,"props":875,"children":876},{},[877],{"type":51,"value":878},"A primary metric with no events is worse than no primary metric.",{"type":51,"value":880}," The experiment produces no statistical output. Event health is a hard requirement for the primary metric.",{"type":46,"tag":90,"props":882,"children":883},{},[884,889],{"type":46,"tag":80,"props":885,"children":886},{},[887],{"type":51,"value":888},"CUPED and percentile analysis are incompatible.",{"type":51,"value":890}," If the experiment uses CUPED variance reduction, percentile-based metrics (e.g. p95 latency) silently degrade to mean-based analysis. Flag this if the user selects a percentile metric in a CUPED-enabled experiment.",{"type":46,"tag":90,"props":892,"children":893},{},[894,899,901,907,909,915,917,923],{"type":46,"tag":80,"props":895,"children":896},{},[897],{"type":51,"value":898},"Context kind mismatches cause missing data.",{"type":51,"value":900}," If the metric event is tracked with a ",{"type":46,"tag":94,"props":902,"children":904},{"className":903},[],[905],{"type":51,"value":906},"device",{"type":51,"value":908}," context but the experiment randomizes on ",{"type":46,"tag":94,"props":910,"children":912},{"className":911},[],[913],{"type":51,"value":914},"user",{"type":51,"value":916},", the event won't be attributed correctly. Confirm that the context kind in ",{"type":46,"tag":94,"props":918,"children":920},{"className":919},[],[921],{"type":51,"value":922},"track()",{"type":51,"value":924}," calls matches the experiment's randomization unit.",{"type":46,"tag":90,"props":926,"children":927},{},[928,933],{"type":46,"tag":80,"props":929,"children":930},{},[931],{"type":51,"value":932},"Release policy metrics must share the same context kind.",{"type":51,"value":934}," All metrics in a guarded rollout release policy must use the same randomization unit. If the user proposes metrics with mismatched context kinds, flag it before they try to configure the policy.",{"type":46,"tag":65,"props":936,"children":938},{"id":937},"related-skills",[939],{"type":51,"value":940},"Related Skills",{"type":46,"tag":86,"props":942,"children":943},{},[944,960],{"type":46,"tag":90,"props":945,"children":946},{},[947,958],{"type":46,"tag":948,"props":949,"children":951},"a",{"href":950},"..\u002Flaunchdarkly-metric-create\u002FSKILL.md",[952],{"type":46,"tag":94,"props":953,"children":955},{"className":954},[],[956],{"type":51,"value":957},"launchdarkly-metric-create",{"type":51,"value":959}," — create a metric that doesn't exist yet",{"type":46,"tag":90,"props":961,"children":962},{},[963,973,975,980],{"type":46,"tag":948,"props":964,"children":966},{"href":965},"..\u002Flaunchdarkly-metric-instrument\u002FSKILL.md",[967],{"type":46,"tag":94,"props":968,"children":970},{"className":969},[],[971],{"type":51,"value":972},"launchdarkly-metric-instrument",{"type":51,"value":974}," — add a ",{"type":46,"tag":94,"props":976,"children":978},{"className":977},[],[979],{"type":51,"value":922},{"type":51,"value":981}," call so events start flowing",{"items":983,"total":1065},[984,1001,1010,1020,1031,1043,1051],{"slug":985,"name":985,"fn":986,"description":987,"org":988,"tags":989,"stars":23,"repoUrl":24,"updatedAt":1000},"agent-graphs","create and manage agent graphs","Create and manage agent graphs — directed graphs of configs connected by edges with handoff logic. Use when building multi-agent workflows where configs route to each other.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[990,993,996,997],{"name":991,"slug":992,"type":15},"Agents","agents",{"name":994,"slug":995,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":998,"slug":999,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1002,"name":1002,"fn":1003,"description":1004,"org":1005,"tags":1006,"stars":23,"repoUrl":24,"updatedAt":1009},"aiconfig-agent-graphs","manage agent graphs","DEPRECATED redirect — this skill was renamed to agent-graphs. Do not use this skill; invoke agent-graphs instead. Kept only so old references to aiconfig-agent-graphs still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1007,1008],{"name":991,"slug":992,"type":15},{"name":994,"slug":995,"type":15},"2026-05-22T06:55:56.527064",{"slug":1011,"name":1011,"fn":1012,"description":1013,"org":1014,"tags":1015,"stars":23,"repoUrl":24,"updatedAt":1019},"aiconfig-ai-metrics","manage built-in AI metrics","DEPRECATED redirect — this skill was renamed to built-in-metrics. Do not use this skill; invoke built-in-metrics instead. Kept only so old references to aiconfig-ai-metrics still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1016,1017,1018],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-05-22T06:55:53.858749",{"slug":1021,"name":1021,"fn":1022,"description":1023,"org":1024,"tags":1025,"stars":23,"repoUrl":24,"updatedAt":1030},"aiconfig-create","redirect to configs-create skill","DEPRECATED redirect — this skill was renamed to configs-create. Do not use this skill; invoke configs-create instead. Kept only so old references to aiconfig-create still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1026,1027],{"name":9,"slug":8,"type":15},{"name":1028,"slug":1029,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1032,"name":1032,"fn":1033,"description":1034,"org":1035,"tags":1036,"stars":23,"repoUrl":24,"updatedAt":1042},"aiconfig-custom-metrics","configure custom metrics in LaunchDarkly","DEPRECATED redirect — this skill was renamed to custom-metrics. Do not use this skill; invoke custom-metrics instead. Kept only so old references to aiconfig-custom-metrics still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1037,1038,1041],{"name":13,"slug":14,"type":15},{"name":1039,"slug":1040,"type":15},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1044,"name":1044,"fn":1045,"description":1046,"org":1047,"tags":1048,"stars":23,"repoUrl":24,"updatedAt":1050},"aiconfig-migrate","redirect to migrate skill","DEPRECATED redirect — this skill was renamed to migrate. Do not use this skill; invoke migrate instead. Kept only so old references to aiconfig-migrate still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1049],{"name":1028,"slug":1029,"type":15},"2026-05-22T06:55:44.464733",{"slug":1052,"name":1052,"fn":1053,"description":1054,"org":1055,"tags":1056,"stars":23,"repoUrl":24,"updatedAt":1064},"aiconfig-online-evals","run online evaluations","DEPRECATED redirect — this skill was renamed to online-evals. Do not use this skill; invoke online-evals instead. Kept only so old references to aiconfig-online-evals still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1057,1060,1061],{"name":1058,"slug":1059,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1062,"slug":1063,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",49,{"items":1067,"total":1065},[1068,1075,1080,1086,1091,1097,1101,1107,1118,1127,1137,1146],{"slug":985,"name":985,"fn":986,"description":987,"org":1069,"tags":1070,"stars":23,"repoUrl":24,"updatedAt":1000},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1071,1072,1073,1074],{"name":991,"slug":992,"type":15},{"name":994,"slug":995,"type":15},{"name":9,"slug":8,"type":15},{"name":998,"slug":999,"type":15},{"slug":1002,"name":1002,"fn":1003,"description":1004,"org":1076,"tags":1077,"stars":23,"repoUrl":24,"updatedAt":1009},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1078,1079],{"name":991,"slug":992,"type":15},{"name":994,"slug":995,"type":15},{"slug":1011,"name":1011,"fn":1012,"description":1013,"org":1081,"tags":1082,"stars":23,"repoUrl":24,"updatedAt":1019},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1083,1084,1085],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"slug":1021,"name":1021,"fn":1022,"description":1023,"org":1087,"tags":1088,"stars":23,"repoUrl":24,"updatedAt":1030},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1089,1090],{"name":9,"slug":8,"type":15},{"name":1028,"slug":1029,"type":15},{"slug":1032,"name":1032,"fn":1033,"description":1034,"org":1092,"tags":1093,"stars":23,"repoUrl":24,"updatedAt":1042},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1094,1095,1096],{"name":13,"slug":14,"type":15},{"name":1039,"slug":1040,"type":15},{"name":9,"slug":8,"type":15},{"slug":1044,"name":1044,"fn":1045,"description":1046,"org":1098,"tags":1099,"stars":23,"repoUrl":24,"updatedAt":1050},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1100],{"name":1028,"slug":1029,"type":15},{"slug":1052,"name":1052,"fn":1053,"description":1054,"org":1102,"tags":1103,"stars":23,"repoUrl":24,"updatedAt":1064},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1104,1105,1106],{"name":1058,"slug":1059,"type":15},{"name":9,"slug":8,"type":15},{"name":1062,"slug":1063,"type":15},{"slug":1108,"name":1108,"fn":1109,"description":1110,"org":1111,"tags":1112,"stars":23,"repoUrl":24,"updatedAt":1117},"aiconfig-projects","manage AI configuration projects","DEPRECATED redirect — this skill was renamed to projects. Do not use this skill; invoke projects instead. Kept only so old references to aiconfig-projects still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1113,1116],{"name":1114,"slug":1115,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1119,"name":1119,"fn":1120,"description":1121,"org":1122,"tags":1123,"stars":23,"repoUrl":24,"updatedAt":1126},"aiconfig-snippets","manage AI configuration snippets","DEPRECATED redirect — this skill was renamed to snippets. Do not use this skill; invoke snippets instead. Kept only so old references to aiconfig-snippets still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1124,1125],{"name":1114,"slug":1115,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1128,"name":1128,"fn":1129,"description":1130,"org":1131,"tags":1132,"stars":23,"repoUrl":24,"updatedAt":1136},"aiconfig-targeting","configure LaunchDarkly targeting rules","DEPRECATED redirect — this skill was renamed to configs-targeting. Do not use this skill; invoke configs-targeting instead. Kept only so old references to aiconfig-targeting still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1133,1134,1135],{"name":1114,"slug":1115,"type":15},{"name":1039,"slug":1040,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1138,"name":1138,"fn":1139,"description":1140,"org":1141,"tags":1142,"stars":23,"repoUrl":24,"updatedAt":1145},"aiconfig-tools","redirect to tools skill","DEPRECATED redirect — this skill was renamed to tools. Do not use this skill; invoke tools instead. Kept only so old references to aiconfig-tools still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1143,1144],{"name":9,"slug":8,"type":15},{"name":1028,"slug":1029,"type":15},"2026-05-22T06:55:39.13373",{"slug":1147,"name":1147,"fn":1148,"description":1149,"org":1150,"tags":1151,"stars":23,"repoUrl":24,"updatedAt":1154},"aiconfig-update","redirect to configs-update skill","DEPRECATED redirect — this skill was renamed to configs-update. Do not use this skill; invoke configs-update instead. Kept only so old references to aiconfig-update still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1152,1153],{"name":9,"slug":8,"type":15},{"name":1028,"slug":1029,"type":15},"2026-05-22T06:55:40.464884"]