[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-launchdarkly-metric-instrument":3,"mdc--dqx8do-key":34,"related-repo-launchdarkly-launchdarkly-metric-instrument":1522,"related-org-launchdarkly-launchdarkly-metric-instrument":1606},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":29,"sourceUrl":32,"mdContent":33},"launchdarkly-metric-instrument","instrument code for metric tracking","Instrument a LaunchDarkly metric event in a codebase by adding a track() call. Use when the user wants to wire up an event, instrument an action for a metric, add tracking to a feature, or confirm that an event is flowing to LaunchDarkly.",{"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],{"name":13,"slug":14,"type":15},"Analytics","analytics","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Metrics","metrics",20,"https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling","2026-05-15T06:19:39.442804","Apache-2.0",6,[26,27,28],"agent-skills","launchdarkly-ai","managed-by-terraform",{"repoUrl":21,"stars":20,"forks":24,"topics":30,"description":31},[26,27,28],"LaunchDarkly's official AI tooling","https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling\u002Ftree\u002FHEAD\u002Fskills\u002Fmetrics\u002Flaunchdarkly-metric-instrument","---\nname: launchdarkly-metric-instrument\ndescription: \"Instrument a LaunchDarkly metric event in a codebase by adding a track() call. Use when the user wants to wire up an event, instrument an action for a metric, add tracking to a feature, or confirm that an event is flowing to LaunchDarkly.\"\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 Instrument\n\nYou're using a skill that will guide you through adding a `track()` call to a codebase so a LaunchDarkly metric can measure it. Your job is to detect the SDK in use, find the right place in code to add the call, write it correctly, and verify that events are reaching LaunchDarkly.\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-metric-events` — verify events are flowing after instrumentation\n\n**Optional MCP tools (enhance workflow):**\n- `get-project` — retrieve the SDK key for the right environment when SDK initialization is needed\n\n## Workflow\n\n### Step 1: Detect the SDK\n\nBefore writing any code, understand the LaunchDarkly setup already in this codebase.\n\n1. **Search for existing `track()` calls.** This is the fastest signal:\n   - Look for `ldClient.track(`, `.track(`, `ld.track(`\n   - If any exist, they tell you the SDK type, call signature, and context pattern in one shot — mirror those exactly.\n\n2. **Search for SDK imports and initialization** if no `track()` calls exist:\n   - Check `package.json`, `requirements.txt`, `go.mod`, `Gemfile`, `*.csproj` for an LD SDK dependency\n   - Look for `LDClient`, `ldclient`, `launchdarkly-server-sdk`, `launchdarkly-node-server-sdk`, `launchdarkly-react-client-sdk`, etc.\n   - Find the initialization block to understand how the client is accessed across the codebase\n\n3. **Determine client-side or server-side.** This is the most critical distinction — it determines the `track()` signature:\n\n   | SDK type | `track()` signature | Notes |\n   |----------|---------------------|-------|\n   | Server-side (Node, Python, Go, Java, Ruby, .NET) | `ldClient.track(eventKey, context, data?, metricValue?)` | Context required per call |\n   | Client-side (React, browser JS) | `ldClient.track(eventKey, data?, metricValue?)` | Context set at init, not per call |\n\n   See [SDK Track Patterns](references\u002Fsdk-track-patterns.md) for full examples by language.\n\n### Step 2: Install & Initialize (if SDK not present)\n\nSkip this step if the SDK is already in the codebase.\n\n1. **Detect the package manager** from lockfiles: `package-lock.json` \u002F `yarn.lock` \u002F `pnpm-lock.yaml` → npm\u002Fyarn\u002Fpnpm; `Pipfile.lock` \u002F `poetry.lock` → pip\u002Fpoetry; `go.sum` → go modules; `Gemfile.lock` → bundler.\n\n2. **Install the appropriate SDK** using the detected package manager. See [SDK Track Patterns](references\u002Fsdk-track-patterns.md) for the right package name per language.\n\n3. **Get the SDK key** using `get-project` — fetch the project and choose the key for the environment the user wants to instrument (typically `production` or `staging` for initial testing).\n\n4. **Add SDK initialization** following the patterns already in this codebase. If there's a central config or service layer, add the LD client there. See [SDK Track Patterns](references\u002Fsdk-track-patterns.md) for initialization examples.\n\n### Step 3: Find the Right Placement\n\nLocate where in the code the user action or event occurs.\n\n1. **Ask if you're not sure** where the action happens. Don't guess at placement — a `track()` call in the wrong location (e.g. a render method instead of a submit handler) produces misleading data.\n\n2. **Look for signals of the right location:**\n   - Form submissions, button click handlers, API route completions, mutation hooks\n   - Existing analytics calls (`segment.track()`, `mixpanel.track()`, `gtag()`) — these are often co-located with where LD track calls should go\n   - Comments like `\u002F\u002F TODO: track this`\n\n3. **Show the candidate location** to the user before writing anything:\n   ```\n   I'll add the track() call here, in the checkout submit handler (src\u002Fcheckout\u002FCheckoutForm.tsx, line 47).\n   Does that look right?\n   ```\n\n4. **Proceed once confirmed** (or if you're confident enough from codebase signals).\n\n### Step 4: Write the `track()` Call\n\nWrite the call following the patterns found in Step 1.\n\n**Server-side SDKs** — context is required:\n```typescript\nldClient.track('checkout-completed', context);\n```\n\n**Client-side SDKs** — context is implicit:\n```typescript\nldClient.track('checkout-completed');\n```\n\n**For `value` metrics** — include `metricValue` with the numeric measurement:\n```typescript\n\u002F\u002F Server-side: latency metric (ms)\nldClient.track('api-response-time', context, null, responseTimeMs);\n\n\u002F\u002F Client-side: revenue metric\nldClient.track('purchase-completed', { orderId }, purchaseAmountUSD);\n```\n\n**Key rules:**\n- **Match the existing context.** Don't construct a new context inline. Find where the codebase already builds its context\u002Fuser object (used for `variation()` calls) and use the same one. This is how LD correlates the event to the right experiment participant.\n- **`metricValue` only for `value` metrics.** For `count` and `occurrence` metrics, omit `metricValue` entirely.\n- **Respect wrapper patterns.** If the codebase wraps LD calls behind a utility (`featureFlags.track()`, `analytics.ldTrack()`), add the new call through that wrapper — not by calling `ldClient` directly.\n- **Match the event key exactly.** `track()` event keys are case-sensitive. Use the exact string that the metric was created with.\n\nSee [SDK Track Patterns](references\u002Fsdk-track-patterns.md) for full per-language examples.\n\n### Step 5: Verify\n\n**Guide the user to trigger the action** in their local or staging environment. Then use `list-metric-events` to confirm the event key appears:\n\n```\nlist-metric-events(projectKey, environmentKey)\n```\n\n**If the event key appears:** confirm success and show a summary.\n\n**If the event key is absent after triggering**, work through this checklist:\n\n| Problem | Check |\n|---------|-------|\n| Wrong event key casing | Does the `track()` call match the metric's event key exactly? |\n| SDK not initialized | Is `ldClient` initialized before the `track()` call runs? |\n| Server-side: wrong context | Is the context passed to `track()` the same context used for `variation()` calls? |\n| Client-side: no flag evaluation first | Has the SDK initialized and identified the user before `track()` is called? |\n| Wrong environment | Is `list-metric-events` querying the same environment where the action was triggered? |\n| Data delay | `list-metric-events` shows the last 90 days with up to ~5 min delay — try again in a moment |\n\nSurface a summary once verified:\n\n```\n✓ Event flowing: checkout-completed\n  Seen in: production\n  \nNext: this event is now ready to back a metric. Use the metric-create skill to set one up,\nor attach an existing metric to your experiment.\n```\n\n## Important Context\n\n- **`track()` calls only count in experiments when a flag is evaluated first.** The event is correlated to an experiment participant because LD saw a `variation()` call from that context. If the user triggers the action without evaluating any flag, the event may still be ingested but won't appear in experiment results.\n- **Client-side SDKs flush events on an interval** (default ~30 seconds) or on page unload. In tests, you may need to call `ldClient.flush()` explicitly to see events appear immediately.\n- **Server-side SDKs also buffer events.** Calling `ldClient.flush()` after `track()` in development ensures the event is sent before the process exits or the test ends.\n- **`metricValue` units must match the metric definition.** If the metric was created with unit `ms`, pass milliseconds. Passing seconds into a milliseconds metric will produce silently wrong results.\n- **The `data` parameter is for custom metadata, not the metric value.** Pass extra context (order ID, category, etc.) in `data`. Pass the numeric measurement in `metricValue`.\n\n## References\n\n- [SDK Track Patterns](references\u002Fsdk-track-patterns.md) — `track()` call syntax, initialization, and package names for every supported SDK\n",{"data":35,"body":39},{"name":4,"description":6,"license":23,"compatibility":36,"metadata":37},"Requires the remotely hosted LaunchDarkly MCP server",{"author":8,"version":38},"1.0.0-experimental",{"type":40,"children":41},"root",[42,50,65,72,77,86,102,110,124,130,137,142,417,423,428,560,566,571,677,690,695,705,773,783,830,856,1012,1020,1135,1145,1151,1168,1177,1187,1197,1350,1355,1364,1370,1491,1497,1516],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","LaunchDarkly Metric Instrument",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54,56,63],{"type":48,"value":55},"You're using a skill that will guide you through adding a ",{"type":43,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":48,"value":62},"track()",{"type":48,"value":64}," call to a codebase so a LaunchDarkly metric can measure it. Your job is to detect the SDK in use, find the right place in code to add the call, write it correctly, and verify that events are reaching LaunchDarkly.",{"type":43,"tag":66,"props":67,"children":69},"h2",{"id":68},"prerequisites",[70],{"type":48,"value":71},"Prerequisites",{"type":43,"tag":51,"props":73,"children":74},{},[75],{"type":48,"value":76},"This skill requires the remotely hosted LaunchDarkly MCP server to be configured in your environment.",{"type":43,"tag":51,"props":78,"children":79},{},[80],{"type":43,"tag":81,"props":82,"children":83},"strong",{},[84],{"type":48,"value":85},"Required MCP tools:",{"type":43,"tag":87,"props":88,"children":89},"ul",{},[90],{"type":43,"tag":91,"props":92,"children":93},"li",{},[94,100],{"type":43,"tag":57,"props":95,"children":97},{"className":96},[],[98],{"type":48,"value":99},"list-metric-events",{"type":48,"value":101}," — verify events are flowing after instrumentation",{"type":43,"tag":51,"props":103,"children":104},{},[105],{"type":43,"tag":81,"props":106,"children":107},{},[108],{"type":48,"value":109},"Optional MCP tools (enhance workflow):",{"type":43,"tag":87,"props":111,"children":112},{},[113],{"type":43,"tag":91,"props":114,"children":115},{},[116,122],{"type":43,"tag":57,"props":117,"children":119},{"className":118},[],[120],{"type":48,"value":121},"get-project",{"type":48,"value":123}," — retrieve the SDK key for the right environment when SDK initialization is needed",{"type":43,"tag":66,"props":125,"children":127},{"id":126},"workflow",[128],{"type":48,"value":129},"Workflow",{"type":43,"tag":131,"props":132,"children":134},"h3",{"id":133},"step-1-detect-the-sdk",[135],{"type":48,"value":136},"Step 1: Detect the SDK",{"type":43,"tag":51,"props":138,"children":139},{},[140],{"type":48,"value":141},"Before writing any code, understand the LaunchDarkly setup already in this codebase.",{"type":43,"tag":143,"props":144,"children":145},"ol",{},[146,197,303],{"type":43,"tag":91,"props":147,"children":148},{},[149,161,163],{"type":43,"tag":81,"props":150,"children":151},{},[152,154,159],{"type":48,"value":153},"Search for existing ",{"type":43,"tag":57,"props":155,"children":157},{"className":156},[],[158],{"type":48,"value":62},{"type":48,"value":160}," calls.",{"type":48,"value":162}," This is the fastest signal:",{"type":43,"tag":87,"props":164,"children":165},{},[166,192],{"type":43,"tag":91,"props":167,"children":168},{},[169,171,177,179,185,186],{"type":48,"value":170},"Look for ",{"type":43,"tag":57,"props":172,"children":174},{"className":173},[],[175],{"type":48,"value":176},"ldClient.track(",{"type":48,"value":178},", ",{"type":43,"tag":57,"props":180,"children":182},{"className":181},[],[183],{"type":48,"value":184},".track(",{"type":48,"value":178},{"type":43,"tag":57,"props":187,"children":189},{"className":188},[],[190],{"type":48,"value":191},"ld.track(",{"type":43,"tag":91,"props":193,"children":194},{},[195],{"type":48,"value":196},"If any exist, they tell you the SDK type, call signature, and context pattern in one shot — mirror those exactly.",{"type":43,"tag":91,"props":198,"children":199},{},[200,205,207,212,214],{"type":43,"tag":81,"props":201,"children":202},{},[203],{"type":48,"value":204},"Search for SDK imports and initialization",{"type":48,"value":206}," if no ",{"type":43,"tag":57,"props":208,"children":210},{"className":209},[],[211],{"type":48,"value":62},{"type":48,"value":213}," calls exist:",{"type":43,"tag":87,"props":215,"children":216},{},[217,258,298],{"type":43,"tag":91,"props":218,"children":219},{},[220,222,228,229,235,236,242,243,249,250,256],{"type":48,"value":221},"Check ",{"type":43,"tag":57,"props":223,"children":225},{"className":224},[],[226],{"type":48,"value":227},"package.json",{"type":48,"value":178},{"type":43,"tag":57,"props":230,"children":232},{"className":231},[],[233],{"type":48,"value":234},"requirements.txt",{"type":48,"value":178},{"type":43,"tag":57,"props":237,"children":239},{"className":238},[],[240],{"type":48,"value":241},"go.mod",{"type":48,"value":178},{"type":43,"tag":57,"props":244,"children":246},{"className":245},[],[247],{"type":48,"value":248},"Gemfile",{"type":48,"value":178},{"type":43,"tag":57,"props":251,"children":253},{"className":252},[],[254],{"type":48,"value":255},"*.csproj",{"type":48,"value":257}," for an LD SDK dependency",{"type":43,"tag":91,"props":259,"children":260},{},[261,262,268,269,275,276,282,283,289,290,296],{"type":48,"value":170},{"type":43,"tag":57,"props":263,"children":265},{"className":264},[],[266],{"type":48,"value":267},"LDClient",{"type":48,"value":178},{"type":43,"tag":57,"props":270,"children":272},{"className":271},[],[273],{"type":48,"value":274},"ldclient",{"type":48,"value":178},{"type":43,"tag":57,"props":277,"children":279},{"className":278},[],[280],{"type":48,"value":281},"launchdarkly-server-sdk",{"type":48,"value":178},{"type":43,"tag":57,"props":284,"children":286},{"className":285},[],[287],{"type":48,"value":288},"launchdarkly-node-server-sdk",{"type":48,"value":178},{"type":43,"tag":57,"props":291,"children":293},{"className":292},[],[294],{"type":48,"value":295},"launchdarkly-react-client-sdk",{"type":48,"value":297},", etc.",{"type":43,"tag":91,"props":299,"children":300},{},[301],{"type":48,"value":302},"Find the initialization block to understand how the client is accessed across the codebase",{"type":43,"tag":91,"props":304,"children":305},{},[306,311,313,318,320,402,406,408,415],{"type":43,"tag":81,"props":307,"children":308},{},[309],{"type":48,"value":310},"Determine client-side or server-side.",{"type":48,"value":312}," This is the most critical distinction — it determines the ",{"type":43,"tag":57,"props":314,"children":316},{"className":315},[],[317],{"type":48,"value":62},{"type":48,"value":319}," signature:",{"type":43,"tag":321,"props":322,"children":323},"table",{},[324,353],{"type":43,"tag":325,"props":326,"children":327},"thead",{},[328],{"type":43,"tag":329,"props":330,"children":331},"tr",{},[332,338,348],{"type":43,"tag":333,"props":334,"children":335},"th",{},[336],{"type":48,"value":337},"SDK type",{"type":43,"tag":333,"props":339,"children":340},{},[341,346],{"type":43,"tag":57,"props":342,"children":344},{"className":343},[],[345],{"type":48,"value":62},{"type":48,"value":347}," signature",{"type":43,"tag":333,"props":349,"children":350},{},[351],{"type":48,"value":352},"Notes",{"type":43,"tag":354,"props":355,"children":356},"tbody",{},[357,380],{"type":43,"tag":329,"props":358,"children":359},{},[360,366,375],{"type":43,"tag":361,"props":362,"children":363},"td",{},[364],{"type":48,"value":365},"Server-side (Node, Python, Go, Java, Ruby, .NET)",{"type":43,"tag":361,"props":367,"children":368},{},[369],{"type":43,"tag":57,"props":370,"children":372},{"className":371},[],[373],{"type":48,"value":374},"ldClient.track(eventKey, context, data?, metricValue?)",{"type":43,"tag":361,"props":376,"children":377},{},[378],{"type":48,"value":379},"Context required per call",{"type":43,"tag":329,"props":381,"children":382},{},[383,388,397],{"type":43,"tag":361,"props":384,"children":385},{},[386],{"type":48,"value":387},"Client-side (React, browser JS)",{"type":43,"tag":361,"props":389,"children":390},{},[391],{"type":43,"tag":57,"props":392,"children":394},{"className":393},[],[395],{"type":48,"value":396},"ldClient.track(eventKey, data?, metricValue?)",{"type":43,"tag":361,"props":398,"children":399},{},[400],{"type":48,"value":401},"Context set at init, not per call",{"type":43,"tag":403,"props":404,"children":405},"br",{},[],{"type":48,"value":407},"See ",{"type":43,"tag":409,"props":410,"children":412},"a",{"href":411},"references\u002Fsdk-track-patterns.md",[413],{"type":48,"value":414},"SDK Track Patterns",{"type":48,"value":416}," for full examples by language.",{"type":43,"tag":131,"props":418,"children":420},{"id":419},"step-2-install-initialize-if-sdk-not-present",[421],{"type":48,"value":422},"Step 2: Install & Initialize (if SDK not present)",{"type":43,"tag":51,"props":424,"children":425},{},[426],{"type":48,"value":427},"Skip this step if the SDK is already in the codebase.",{"type":43,"tag":143,"props":429,"children":430},{},[431,495,511,544],{"type":43,"tag":91,"props":432,"children":433},{},[434,439,441,447,449,455,456,462,464,470,471,477,479,485,487,493],{"type":43,"tag":81,"props":435,"children":436},{},[437],{"type":48,"value":438},"Detect the package manager",{"type":48,"value":440}," from lockfiles: ",{"type":43,"tag":57,"props":442,"children":444},{"className":443},[],[445],{"type":48,"value":446},"package-lock.json",{"type":48,"value":448}," \u002F ",{"type":43,"tag":57,"props":450,"children":452},{"className":451},[],[453],{"type":48,"value":454},"yarn.lock",{"type":48,"value":448},{"type":43,"tag":57,"props":457,"children":459},{"className":458},[],[460],{"type":48,"value":461},"pnpm-lock.yaml",{"type":48,"value":463}," → npm\u002Fyarn\u002Fpnpm; ",{"type":43,"tag":57,"props":465,"children":467},{"className":466},[],[468],{"type":48,"value":469},"Pipfile.lock",{"type":48,"value":448},{"type":43,"tag":57,"props":472,"children":474},{"className":473},[],[475],{"type":48,"value":476},"poetry.lock",{"type":48,"value":478}," → pip\u002Fpoetry; ",{"type":43,"tag":57,"props":480,"children":482},{"className":481},[],[483],{"type":48,"value":484},"go.sum",{"type":48,"value":486}," → go modules; ",{"type":43,"tag":57,"props":488,"children":490},{"className":489},[],[491],{"type":48,"value":492},"Gemfile.lock",{"type":48,"value":494}," → bundler.",{"type":43,"tag":91,"props":496,"children":497},{},[498,503,505,509],{"type":43,"tag":81,"props":499,"children":500},{},[501],{"type":48,"value":502},"Install the appropriate SDK",{"type":48,"value":504}," using the detected package manager. See ",{"type":43,"tag":409,"props":506,"children":507},{"href":411},[508],{"type":48,"value":414},{"type":48,"value":510}," for the right package name per language.",{"type":43,"tag":91,"props":512,"children":513},{},[514,519,521,526,528,534,536,542],{"type":43,"tag":81,"props":515,"children":516},{},[517],{"type":48,"value":518},"Get the SDK key",{"type":48,"value":520}," using ",{"type":43,"tag":57,"props":522,"children":524},{"className":523},[],[525],{"type":48,"value":121},{"type":48,"value":527}," — fetch the project and choose the key for the environment the user wants to instrument (typically ",{"type":43,"tag":57,"props":529,"children":531},{"className":530},[],[532],{"type":48,"value":533},"production",{"type":48,"value":535}," or ",{"type":43,"tag":57,"props":537,"children":539},{"className":538},[],[540],{"type":48,"value":541},"staging",{"type":48,"value":543}," for initial testing).",{"type":43,"tag":91,"props":545,"children":546},{},[547,552,554,558],{"type":43,"tag":81,"props":548,"children":549},{},[550],{"type":48,"value":551},"Add SDK initialization",{"type":48,"value":553}," following the patterns already in this codebase. If there's a central config or service layer, add the LD client there. See ",{"type":43,"tag":409,"props":555,"children":556},{"href":411},[557],{"type":48,"value":414},{"type":48,"value":559}," for initialization examples.",{"type":43,"tag":131,"props":561,"children":563},{"id":562},"step-3-find-the-right-placement",[564],{"type":48,"value":565},"Step 3: Find the Right Placement",{"type":43,"tag":51,"props":567,"children":568},{},[569],{"type":48,"value":570},"Locate where in the code the user action or event occurs.",{"type":43,"tag":143,"props":572,"children":573},{},[574,591,645,667],{"type":43,"tag":91,"props":575,"children":576},{},[577,582,584,589],{"type":43,"tag":81,"props":578,"children":579},{},[580],{"type":48,"value":581},"Ask if you're not sure",{"type":48,"value":583}," where the action happens. Don't guess at placement — a ",{"type":43,"tag":57,"props":585,"children":587},{"className":586},[],[588],{"type":48,"value":62},{"type":48,"value":590}," call in the wrong location (e.g. a render method instead of a submit handler) produces misleading data.",{"type":43,"tag":91,"props":592,"children":593},{},[594,599],{"type":43,"tag":81,"props":595,"children":596},{},[597],{"type":48,"value":598},"Look for signals of the right location:",{"type":43,"tag":87,"props":600,"children":601},{},[602,607,634],{"type":43,"tag":91,"props":603,"children":604},{},[605],{"type":48,"value":606},"Form submissions, button click handlers, API route completions, mutation hooks",{"type":43,"tag":91,"props":608,"children":609},{},[610,612,618,619,625,626,632],{"type":48,"value":611},"Existing analytics calls (",{"type":43,"tag":57,"props":613,"children":615},{"className":614},[],[616],{"type":48,"value":617},"segment.track()",{"type":48,"value":178},{"type":43,"tag":57,"props":620,"children":622},{"className":621},[],[623],{"type":48,"value":624},"mixpanel.track()",{"type":48,"value":178},{"type":43,"tag":57,"props":627,"children":629},{"className":628},[],[630],{"type":48,"value":631},"gtag()",{"type":48,"value":633},") — these are often co-located with where LD track calls should go",{"type":43,"tag":91,"props":635,"children":636},{},[637,639],{"type":48,"value":638},"Comments like ",{"type":43,"tag":57,"props":640,"children":642},{"className":641},[],[643],{"type":48,"value":644},"\u002F\u002F TODO: track this",{"type":43,"tag":91,"props":646,"children":647},{},[648,653,655],{"type":43,"tag":81,"props":649,"children":650},{},[651],{"type":48,"value":652},"Show the candidate location",{"type":48,"value":654}," to the user before writing anything:",{"type":43,"tag":656,"props":657,"children":661},"pre",{"className":658,"code":660,"language":48},[659],"language-text","I'll add the track() call here, in the checkout submit handler (src\u002Fcheckout\u002FCheckoutForm.tsx, line 47).\nDoes that look right?\n",[662],{"type":43,"tag":57,"props":663,"children":665},{"__ignoreMap":664},"",[666],{"type":48,"value":660},{"type":43,"tag":91,"props":668,"children":669},{},[670,675],{"type":43,"tag":81,"props":671,"children":672},{},[673],{"type":48,"value":674},"Proceed once confirmed",{"type":48,"value":676}," (or if you're confident enough from codebase signals).",{"type":43,"tag":131,"props":678,"children":680},{"id":679},"step-4-write-the-track-call",[681,683,688],{"type":48,"value":682},"Step 4: Write the ",{"type":43,"tag":57,"props":684,"children":686},{"className":685},[],[687],{"type":48,"value":62},{"type":48,"value":689}," Call",{"type":43,"tag":51,"props":691,"children":692},{},[693],{"type":48,"value":694},"Write the call following the patterns found in Step 1.",{"type":43,"tag":51,"props":696,"children":697},{},[698,703],{"type":43,"tag":81,"props":699,"children":700},{},[701],{"type":48,"value":702},"Server-side SDKs",{"type":48,"value":704}," — context is required:",{"type":43,"tag":656,"props":706,"children":710},{"className":707,"code":708,"language":709,"meta":664,"style":664},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ldClient.track('checkout-completed', context);\n","typescript",[711],{"type":43,"tag":57,"props":712,"children":713},{"__ignoreMap":664},[714],{"type":43,"tag":715,"props":716,"children":719},"span",{"class":717,"line":718},"line",1,[720,726,732,738,743,748,754,758,763,768],{"type":43,"tag":715,"props":721,"children":723},{"style":722},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[724],{"type":48,"value":725},"ldClient",{"type":43,"tag":715,"props":727,"children":729},{"style":728},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[730],{"type":48,"value":731},".",{"type":43,"tag":715,"props":733,"children":735},{"style":734},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[736],{"type":48,"value":737},"track",{"type":43,"tag":715,"props":739,"children":740},{"style":722},[741],{"type":48,"value":742},"(",{"type":43,"tag":715,"props":744,"children":745},{"style":728},[746],{"type":48,"value":747},"'",{"type":43,"tag":715,"props":749,"children":751},{"style":750},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[752],{"type":48,"value":753},"checkout-completed",{"type":43,"tag":715,"props":755,"children":756},{"style":728},[757],{"type":48,"value":747},{"type":43,"tag":715,"props":759,"children":760},{"style":728},[761],{"type":48,"value":762},",",{"type":43,"tag":715,"props":764,"children":765},{"style":722},[766],{"type":48,"value":767}," context)",{"type":43,"tag":715,"props":769,"children":770},{"style":728},[771],{"type":48,"value":772},";\n",{"type":43,"tag":51,"props":774,"children":775},{},[776,781],{"type":43,"tag":81,"props":777,"children":778},{},[779],{"type":48,"value":780},"Client-side SDKs",{"type":48,"value":782}," — context is implicit:",{"type":43,"tag":656,"props":784,"children":786},{"className":707,"code":785,"language":709,"meta":664,"style":664},"ldClient.track('checkout-completed');\n",[787],{"type":43,"tag":57,"props":788,"children":789},{"__ignoreMap":664},[790],{"type":43,"tag":715,"props":791,"children":792},{"class":717,"line":718},[793,797,801,805,809,813,817,821,826],{"type":43,"tag":715,"props":794,"children":795},{"style":722},[796],{"type":48,"value":725},{"type":43,"tag":715,"props":798,"children":799},{"style":728},[800],{"type":48,"value":731},{"type":43,"tag":715,"props":802,"children":803},{"style":734},[804],{"type":48,"value":737},{"type":43,"tag":715,"props":806,"children":807},{"style":722},[808],{"type":48,"value":742},{"type":43,"tag":715,"props":810,"children":811},{"style":728},[812],{"type":48,"value":747},{"type":43,"tag":715,"props":814,"children":815},{"style":750},[816],{"type":48,"value":753},{"type":43,"tag":715,"props":818,"children":819},{"style":728},[820],{"type":48,"value":747},{"type":43,"tag":715,"props":822,"children":823},{"style":722},[824],{"type":48,"value":825},")",{"type":43,"tag":715,"props":827,"children":828},{"style":728},[829],{"type":48,"value":772},{"type":43,"tag":51,"props":831,"children":832},{},[833,846,848,854],{"type":43,"tag":81,"props":834,"children":835},{},[836,838,844],{"type":48,"value":837},"For ",{"type":43,"tag":57,"props":839,"children":841},{"className":840},[],[842],{"type":48,"value":843},"value",{"type":48,"value":845}," metrics",{"type":48,"value":847}," — include ",{"type":43,"tag":57,"props":849,"children":851},{"className":850},[],[852],{"type":48,"value":853},"metricValue",{"type":48,"value":855}," with the numeric measurement:",{"type":43,"tag":656,"props":857,"children":859},{"className":707,"code":858,"language":709,"meta":664,"style":664},"\u002F\u002F Server-side: latency metric (ms)\nldClient.track('api-response-time', context, null, responseTimeMs);\n\n\u002F\u002F Client-side: revenue metric\nldClient.track('purchase-completed', { orderId }, purchaseAmountUSD);\n",[860],{"type":43,"tag":57,"props":861,"children":862},{"__ignoreMap":664},[863,872,932,942,951],{"type":43,"tag":715,"props":864,"children":865},{"class":717,"line":718},[866],{"type":43,"tag":715,"props":867,"children":869},{"style":868},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[870],{"type":48,"value":871},"\u002F\u002F Server-side: latency metric (ms)\n",{"type":43,"tag":715,"props":873,"children":875},{"class":717,"line":874},2,[876,880,884,888,892,896,901,905,909,914,918,923,928],{"type":43,"tag":715,"props":877,"children":878},{"style":722},[879],{"type":48,"value":725},{"type":43,"tag":715,"props":881,"children":882},{"style":728},[883],{"type":48,"value":731},{"type":43,"tag":715,"props":885,"children":886},{"style":734},[887],{"type":48,"value":737},{"type":43,"tag":715,"props":889,"children":890},{"style":722},[891],{"type":48,"value":742},{"type":43,"tag":715,"props":893,"children":894},{"style":728},[895],{"type":48,"value":747},{"type":43,"tag":715,"props":897,"children":898},{"style":750},[899],{"type":48,"value":900},"api-response-time",{"type":43,"tag":715,"props":902,"children":903},{"style":728},[904],{"type":48,"value":747},{"type":43,"tag":715,"props":906,"children":907},{"style":728},[908],{"type":48,"value":762},{"type":43,"tag":715,"props":910,"children":911},{"style":722},[912],{"type":48,"value":913}," context",{"type":43,"tag":715,"props":915,"children":916},{"style":728},[917],{"type":48,"value":762},{"type":43,"tag":715,"props":919,"children":920},{"style":728},[921],{"type":48,"value":922}," null,",{"type":43,"tag":715,"props":924,"children":925},{"style":722},[926],{"type":48,"value":927}," responseTimeMs)",{"type":43,"tag":715,"props":929,"children":930},{"style":728},[931],{"type":48,"value":772},{"type":43,"tag":715,"props":933,"children":935},{"class":717,"line":934},3,[936],{"type":43,"tag":715,"props":937,"children":939},{"emptyLinePlaceholder":938},true,[940],{"type":48,"value":941},"\n",{"type":43,"tag":715,"props":943,"children":945},{"class":717,"line":944},4,[946],{"type":43,"tag":715,"props":947,"children":948},{"style":868},[949],{"type":48,"value":950},"\u002F\u002F Client-side: revenue metric\n",{"type":43,"tag":715,"props":952,"children":954},{"class":717,"line":953},5,[955,959,963,967,971,975,980,984,988,993,998,1003,1008],{"type":43,"tag":715,"props":956,"children":957},{"style":722},[958],{"type":48,"value":725},{"type":43,"tag":715,"props":960,"children":961},{"style":728},[962],{"type":48,"value":731},{"type":43,"tag":715,"props":964,"children":965},{"style":734},[966],{"type":48,"value":737},{"type":43,"tag":715,"props":968,"children":969},{"style":722},[970],{"type":48,"value":742},{"type":43,"tag":715,"props":972,"children":973},{"style":728},[974],{"type":48,"value":747},{"type":43,"tag":715,"props":976,"children":977},{"style":750},[978],{"type":48,"value":979},"purchase-completed",{"type":43,"tag":715,"props":981,"children":982},{"style":728},[983],{"type":48,"value":747},{"type":43,"tag":715,"props":985,"children":986},{"style":728},[987],{"type":48,"value":762},{"type":43,"tag":715,"props":989,"children":990},{"style":728},[991],{"type":48,"value":992}," {",{"type":43,"tag":715,"props":994,"children":995},{"style":722},[996],{"type":48,"value":997}," orderId ",{"type":43,"tag":715,"props":999,"children":1000},{"style":728},[1001],{"type":48,"value":1002},"},",{"type":43,"tag":715,"props":1004,"children":1005},{"style":722},[1006],{"type":48,"value":1007}," purchaseAmountUSD)",{"type":43,"tag":715,"props":1009,"children":1010},{"style":728},[1011],{"type":48,"value":772},{"type":43,"tag":51,"props":1013,"children":1014},{},[1015],{"type":43,"tag":81,"props":1016,"children":1017},{},[1018],{"type":48,"value":1019},"Key rules:",{"type":43,"tag":87,"props":1021,"children":1022},{},[1023,1041,1086,1118],{"type":43,"tag":91,"props":1024,"children":1025},{},[1026,1031,1033,1039],{"type":43,"tag":81,"props":1027,"children":1028},{},[1029],{"type":48,"value":1030},"Match the existing context.",{"type":48,"value":1032}," Don't construct a new context inline. Find where the codebase already builds its context\u002Fuser object (used for ",{"type":43,"tag":57,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":48,"value":1038},"variation()",{"type":48,"value":1040}," calls) and use the same one. This is how LD correlates the event to the right experiment participant.",{"type":43,"tag":91,"props":1042,"children":1043},{},[1044,1061,1063,1069,1071,1077,1079,1084],{"type":43,"tag":81,"props":1045,"children":1046},{},[1047,1052,1054,1059],{"type":43,"tag":57,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":48,"value":853},{"type":48,"value":1053}," only for ",{"type":43,"tag":57,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":48,"value":843},{"type":48,"value":1060}," metrics.",{"type":48,"value":1062}," For ",{"type":43,"tag":57,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":48,"value":1068},"count",{"type":48,"value":1070}," and ",{"type":43,"tag":57,"props":1072,"children":1074},{"className":1073},[],[1075],{"type":48,"value":1076},"occurrence",{"type":48,"value":1078}," metrics, omit ",{"type":43,"tag":57,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":48,"value":853},{"type":48,"value":1085}," entirely.",{"type":43,"tag":91,"props":1087,"children":1088},{},[1089,1094,1096,1102,1103,1109,1111,1116],{"type":43,"tag":81,"props":1090,"children":1091},{},[1092],{"type":48,"value":1093},"Respect wrapper patterns.",{"type":48,"value":1095}," If the codebase wraps LD calls behind a utility (",{"type":43,"tag":57,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":48,"value":1101},"featureFlags.track()",{"type":48,"value":178},{"type":43,"tag":57,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":48,"value":1108},"analytics.ldTrack()",{"type":48,"value":1110},"), add the new call through that wrapper — not by calling ",{"type":43,"tag":57,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":48,"value":725},{"type":48,"value":1117}," directly.",{"type":43,"tag":91,"props":1119,"children":1120},{},[1121,1126,1128,1133],{"type":43,"tag":81,"props":1122,"children":1123},{},[1124],{"type":48,"value":1125},"Match the event key exactly.",{"type":48,"value":1127}," ",{"type":43,"tag":57,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":48,"value":62},{"type":48,"value":1134}," event keys are case-sensitive. Use the exact string that the metric was created with.",{"type":43,"tag":51,"props":1136,"children":1137},{},[1138,1139,1143],{"type":48,"value":407},{"type":43,"tag":409,"props":1140,"children":1141},{"href":411},[1142],{"type":48,"value":414},{"type":48,"value":1144}," for full per-language examples.",{"type":43,"tag":131,"props":1146,"children":1148},{"id":1147},"step-5-verify",[1149],{"type":48,"value":1150},"Step 5: Verify",{"type":43,"tag":51,"props":1152,"children":1153},{},[1154,1159,1161,1166],{"type":43,"tag":81,"props":1155,"children":1156},{},[1157],{"type":48,"value":1158},"Guide the user to trigger the action",{"type":48,"value":1160}," in their local or staging environment. Then use ",{"type":43,"tag":57,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":48,"value":99},{"type":48,"value":1167}," to confirm the event key appears:",{"type":43,"tag":656,"props":1169,"children":1172},{"className":1170,"code":1171,"language":48},[659],"list-metric-events(projectKey, environmentKey)\n",[1173],{"type":43,"tag":57,"props":1174,"children":1175},{"__ignoreMap":664},[1176],{"type":48,"value":1171},{"type":43,"tag":51,"props":1178,"children":1179},{},[1180,1185],{"type":43,"tag":81,"props":1181,"children":1182},{},[1183],{"type":48,"value":1184},"If the event key appears:",{"type":48,"value":1186}," confirm success and show a summary.",{"type":43,"tag":51,"props":1188,"children":1189},{},[1190,1195],{"type":43,"tag":81,"props":1191,"children":1192},{},[1193],{"type":48,"value":1194},"If the event key is absent after triggering",{"type":48,"value":1196},", work through this checklist:",{"type":43,"tag":321,"props":1198,"children":1199},{},[1200,1216],{"type":43,"tag":325,"props":1201,"children":1202},{},[1203],{"type":43,"tag":329,"props":1204,"children":1205},{},[1206,1211],{"type":43,"tag":333,"props":1207,"children":1208},{},[1209],{"type":48,"value":1210},"Problem",{"type":43,"tag":333,"props":1212,"children":1213},{},[1214],{"type":48,"value":1215},"Check",{"type":43,"tag":354,"props":1217,"children":1218},{},[1219,1239,1266,1293,1313,1332],{"type":43,"tag":329,"props":1220,"children":1221},{},[1222,1227],{"type":43,"tag":361,"props":1223,"children":1224},{},[1225],{"type":48,"value":1226},"Wrong event key casing",{"type":43,"tag":361,"props":1228,"children":1229},{},[1230,1232,1237],{"type":48,"value":1231},"Does the ",{"type":43,"tag":57,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":48,"value":62},{"type":48,"value":1238}," call match the metric's event key exactly?",{"type":43,"tag":329,"props":1240,"children":1241},{},[1242,1247],{"type":43,"tag":361,"props":1243,"children":1244},{},[1245],{"type":48,"value":1246},"SDK not initialized",{"type":43,"tag":361,"props":1248,"children":1249},{},[1250,1252,1257,1259,1264],{"type":48,"value":1251},"Is ",{"type":43,"tag":57,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":48,"value":725},{"type":48,"value":1258}," initialized before the ",{"type":43,"tag":57,"props":1260,"children":1262},{"className":1261},[],[1263],{"type":48,"value":62},{"type":48,"value":1265}," call runs?",{"type":43,"tag":329,"props":1267,"children":1268},{},[1269,1274],{"type":43,"tag":361,"props":1270,"children":1271},{},[1272],{"type":48,"value":1273},"Server-side: wrong context",{"type":43,"tag":361,"props":1275,"children":1276},{},[1277,1279,1284,1286,1291],{"type":48,"value":1278},"Is the context passed to ",{"type":43,"tag":57,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":48,"value":62},{"type":48,"value":1285}," the same context used for ",{"type":43,"tag":57,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":48,"value":1038},{"type":48,"value":1292}," calls?",{"type":43,"tag":329,"props":1294,"children":1295},{},[1296,1301],{"type":43,"tag":361,"props":1297,"children":1298},{},[1299],{"type":48,"value":1300},"Client-side: no flag evaluation first",{"type":43,"tag":361,"props":1302,"children":1303},{},[1304,1306,1311],{"type":48,"value":1305},"Has the SDK initialized and identified the user before ",{"type":43,"tag":57,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":48,"value":62},{"type":48,"value":1312}," is called?",{"type":43,"tag":329,"props":1314,"children":1315},{},[1316,1321],{"type":43,"tag":361,"props":1317,"children":1318},{},[1319],{"type":48,"value":1320},"Wrong environment",{"type":43,"tag":361,"props":1322,"children":1323},{},[1324,1325,1330],{"type":48,"value":1251},{"type":43,"tag":57,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":48,"value":99},{"type":48,"value":1331}," querying the same environment where the action was triggered?",{"type":43,"tag":329,"props":1333,"children":1334},{},[1335,1340],{"type":43,"tag":361,"props":1336,"children":1337},{},[1338],{"type":48,"value":1339},"Data delay",{"type":43,"tag":361,"props":1341,"children":1342},{},[1343,1348],{"type":43,"tag":57,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":48,"value":99},{"type":48,"value":1349}," shows the last 90 days with up to ~5 min delay — try again in a moment",{"type":43,"tag":51,"props":1351,"children":1352},{},[1353],{"type":48,"value":1354},"Surface a summary once verified:",{"type":43,"tag":656,"props":1356,"children":1359},{"className":1357,"code":1358,"language":48},[659],"✓ Event flowing: checkout-completed\n  Seen in: production\n  \nNext: this event is now ready to back a metric. Use the metric-create skill to set one up,\nor attach an existing metric to your experiment.\n",[1360],{"type":43,"tag":57,"props":1361,"children":1362},{"__ignoreMap":664},[1363],{"type":48,"value":1358},{"type":43,"tag":66,"props":1365,"children":1367},{"id":1366},"important-context",[1368],{"type":48,"value":1369},"Important Context",{"type":43,"tag":87,"props":1371,"children":1372},{},[1373,1395,1413,1437,1460],{"type":43,"tag":91,"props":1374,"children":1375},{},[1376,1386,1388,1393],{"type":43,"tag":81,"props":1377,"children":1378},{},[1379,1384],{"type":43,"tag":57,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":48,"value":62},{"type":48,"value":1385}," calls only count in experiments when a flag is evaluated first.",{"type":48,"value":1387}," The event is correlated to an experiment participant because LD saw a ",{"type":43,"tag":57,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":48,"value":1038},{"type":48,"value":1394}," call from that context. If the user triggers the action without evaluating any flag, the event may still be ingested but won't appear in experiment results.",{"type":43,"tag":91,"props":1396,"children":1397},{},[1398,1403,1405,1411],{"type":43,"tag":81,"props":1399,"children":1400},{},[1401],{"type":48,"value":1402},"Client-side SDKs flush events on an interval",{"type":48,"value":1404}," (default ~30 seconds) or on page unload. In tests, you may need to call ",{"type":43,"tag":57,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":48,"value":1410},"ldClient.flush()",{"type":48,"value":1412}," explicitly to see events appear immediately.",{"type":43,"tag":91,"props":1414,"children":1415},{},[1416,1421,1423,1428,1430,1435],{"type":43,"tag":81,"props":1417,"children":1418},{},[1419],{"type":48,"value":1420},"Server-side SDKs also buffer events.",{"type":48,"value":1422}," Calling ",{"type":43,"tag":57,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":48,"value":1410},{"type":48,"value":1429}," after ",{"type":43,"tag":57,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":48,"value":62},{"type":48,"value":1436}," in development ensures the event is sent before the process exits or the test ends.",{"type":43,"tag":91,"props":1438,"children":1439},{},[1440,1450,1452,1458],{"type":43,"tag":81,"props":1441,"children":1442},{},[1443,1448],{"type":43,"tag":57,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":48,"value":853},{"type":48,"value":1449}," units must match the metric definition.",{"type":48,"value":1451}," If the metric was created with unit ",{"type":43,"tag":57,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":48,"value":1457},"ms",{"type":48,"value":1459},", pass milliseconds. Passing seconds into a milliseconds metric will produce silently wrong results.",{"type":43,"tag":91,"props":1461,"children":1462},{},[1463,1476,1478,1483,1485,1490],{"type":43,"tag":81,"props":1464,"children":1465},{},[1466,1468,1474],{"type":48,"value":1467},"The ",{"type":43,"tag":57,"props":1469,"children":1471},{"className":1470},[],[1472],{"type":48,"value":1473},"data",{"type":48,"value":1475}," parameter is for custom metadata, not the metric value.",{"type":48,"value":1477}," Pass extra context (order ID, category, etc.) in ",{"type":43,"tag":57,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":48,"value":1473},{"type":48,"value":1484},". Pass the numeric measurement in ",{"type":43,"tag":57,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":48,"value":853},{"type":48,"value":731},{"type":43,"tag":66,"props":1492,"children":1494},{"id":1493},"references",[1495],{"type":48,"value":1496},"References",{"type":43,"tag":87,"props":1498,"children":1499},{},[1500],{"type":43,"tag":91,"props":1501,"children":1502},{},[1503,1507,1509,1514],{"type":43,"tag":409,"props":1504,"children":1505},{"href":411},[1506],{"type":48,"value":414},{"type":48,"value":1508}," — ",{"type":43,"tag":57,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":48,"value":62},{"type":48,"value":1515}," call syntax, initialization, and package names for every supported SDK",{"type":43,"tag":1517,"props":1518,"children":1519},"style",{},[1520],{"type":48,"value":1521},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1523,"total":1605},[1524,1541,1550,1560,1571,1583,1591],{"slug":1525,"name":1525,"fn":1526,"description":1527,"org":1528,"tags":1529,"stars":20,"repoUrl":21,"updatedAt":1540},"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},[1530,1533,1536,1537],{"name":1531,"slug":1532,"type":15},"Agents","agents",{"name":1534,"slug":1535,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":1538,"slug":1539,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1542,"name":1542,"fn":1543,"description":1544,"org":1545,"tags":1546,"stars":20,"repoUrl":21,"updatedAt":1549},"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},[1547,1548],{"name":1531,"slug":1532,"type":15},{"name":1534,"slug":1535,"type":15},"2026-05-22T06:55:56.527064",{"slug":1551,"name":1551,"fn":1552,"description":1553,"org":1554,"tags":1555,"stars":20,"repoUrl":21,"updatedAt":1559},"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},[1556,1557,1558],{"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":1561,"name":1561,"fn":1562,"description":1563,"org":1564,"tags":1565,"stars":20,"repoUrl":21,"updatedAt":1570},"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},[1566,1567],{"name":9,"slug":8,"type":15},{"name":1568,"slug":1569,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1572,"name":1572,"fn":1573,"description":1574,"org":1575,"tags":1576,"stars":20,"repoUrl":21,"updatedAt":1582},"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},[1577,1578,1581],{"name":13,"slug":14,"type":15},{"name":1579,"slug":1580,"type":15},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1584,"name":1584,"fn":1585,"description":1586,"org":1587,"tags":1588,"stars":20,"repoUrl":21,"updatedAt":1590},"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},[1589],{"name":1568,"slug":1569,"type":15},"2026-05-22T06:55:44.464733",{"slug":1592,"name":1592,"fn":1593,"description":1594,"org":1595,"tags":1596,"stars":20,"repoUrl":21,"updatedAt":1604},"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},[1597,1600,1601],{"name":1598,"slug":1599,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1602,"slug":1603,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",49,{"items":1607,"total":1605},[1608,1615,1620,1626,1631,1637,1641,1647,1658,1667,1677,1686],{"slug":1525,"name":1525,"fn":1526,"description":1527,"org":1609,"tags":1610,"stars":20,"repoUrl":21,"updatedAt":1540},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1611,1612,1613,1614],{"name":1531,"slug":1532,"type":15},{"name":1534,"slug":1535,"type":15},{"name":9,"slug":8,"type":15},{"name":1538,"slug":1539,"type":15},{"slug":1542,"name":1542,"fn":1543,"description":1544,"org":1616,"tags":1617,"stars":20,"repoUrl":21,"updatedAt":1549},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1618,1619],{"name":1531,"slug":1532,"type":15},{"name":1534,"slug":1535,"type":15},{"slug":1551,"name":1551,"fn":1552,"description":1553,"org":1621,"tags":1622,"stars":20,"repoUrl":21,"updatedAt":1559},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1623,1624,1625],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"slug":1561,"name":1561,"fn":1562,"description":1563,"org":1627,"tags":1628,"stars":20,"repoUrl":21,"updatedAt":1570},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1629,1630],{"name":9,"slug":8,"type":15},{"name":1568,"slug":1569,"type":15},{"slug":1572,"name":1572,"fn":1573,"description":1574,"org":1632,"tags":1633,"stars":20,"repoUrl":21,"updatedAt":1582},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1634,1635,1636],{"name":13,"slug":14,"type":15},{"name":1579,"slug":1580,"type":15},{"name":9,"slug":8,"type":15},{"slug":1584,"name":1584,"fn":1585,"description":1586,"org":1638,"tags":1639,"stars":20,"repoUrl":21,"updatedAt":1590},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1640],{"name":1568,"slug":1569,"type":15},{"slug":1592,"name":1592,"fn":1593,"description":1594,"org":1642,"tags":1643,"stars":20,"repoUrl":21,"updatedAt":1604},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1644,1645,1646],{"name":1598,"slug":1599,"type":15},{"name":9,"slug":8,"type":15},{"name":1602,"slug":1603,"type":15},{"slug":1648,"name":1648,"fn":1649,"description":1650,"org":1651,"tags":1652,"stars":20,"repoUrl":21,"updatedAt":1657},"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},[1653,1656],{"name":1654,"slug":1655,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1659,"name":1659,"fn":1660,"description":1661,"org":1662,"tags":1663,"stars":20,"repoUrl":21,"updatedAt":1666},"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},[1664,1665],{"name":1654,"slug":1655,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1668,"name":1668,"fn":1669,"description":1670,"org":1671,"tags":1672,"stars":20,"repoUrl":21,"updatedAt":1676},"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},[1673,1674,1675],{"name":1654,"slug":1655,"type":15},{"name":1579,"slug":1580,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1678,"name":1678,"fn":1679,"description":1680,"org":1681,"tags":1682,"stars":20,"repoUrl":21,"updatedAt":1685},"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},[1683,1684],{"name":9,"slug":8,"type":15},{"name":1568,"slug":1569,"type":15},"2026-05-22T06:55:39.13373",{"slug":1687,"name":1687,"fn":1688,"description":1689,"org":1690,"tags":1691,"stars":20,"repoUrl":21,"updatedAt":1694},"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},[1692,1693],{"name":9,"slug":8,"type":15},{"name":1568,"slug":1569,"type":15},"2026-05-22T06:55:40.464884"]