[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-launchdarkly-flag-create":3,"mdc--bqoxb0-key":37,"related-org-launchdarkly-launchdarkly-flag-create":1117,"related-repo-launchdarkly-launchdarkly-flag-create":1251},{"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-flag-create","create and configure feature flags","Create and configure LaunchDarkly feature flags in a way that fits the existing codebase. Use when the user wants to create a new flag, wrap code in a flag, add a feature toggle, or set up an experiment. Guides exploration of existing patterns before creating.",{"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,19,22],{"name":13,"slug":14,"type":15},"Feature Flags","feature-flags","tag",{"name":17,"slug":18,"type":15},"Deployment","deployment",{"name":20,"slug":21,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},20,"https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling","2026-07-24T05:40:55.874933","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\u002Ffeature-flags\u002Flaunchdarkly-flag-create","---\nname: launchdarkly-flag-create\ndescription: \"Create and configure LaunchDarkly feature flags in a way that fits the existing codebase. Use when the user wants to create a new flag, wrap code in a flag, add a feature toggle, or set up an experiment. Guides exploration of existing patterns before creating.\"\nlicense: Apache-2.0\ncompatibility: Requires the remotely hosted LaunchDarkly MCP server\nmetadata:\n  author: launchdarkly\n  version: \"1.1.0-experimental\"\n---\n\n# LaunchDarkly Flag Create & Configure\n\nYou're using a skill that will guide you through introducing a new feature flag into a codebase. Your job is to explore how flags are already used in this codebase, create the flag in LaunchDarkly in a way that fits, add the evaluation code matching existing patterns, and verify everything is wired up correctly.\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- `create-flag`: create a new feature flag in a project\n- `get-flag`: verify the flag was created correctly\n\n**Optional MCP tools (enhance workflow):**\n- `list-flags`: browse existing flags to understand naming conventions and tags\n- `update-flag-settings`: update flag metadata (name, description, tags, temporary\u002Fpermanent status)\n\n## Workflow\n\n### Step 1: Explore the Codebase\n\nBefore creating anything, understand how this codebase uses feature flags.\n\n1. **Find the SDK.** Search for LaunchDarkly SDK imports or initialization:\n   - Look for `launchdarkly`, `ldclient`, `ld-client`, `LDClient` in imports\n   - Check `package.json`, `requirements.txt`, `go.mod`, `Gemfile`, or equivalent for the SDK dependency\n   - Identify which SDK is in use (server-side Node, React, Python, Go, Java, etc.)\n\n2. **Find existing flag evaluations.** Search for variation calls to understand the patterns this codebase uses:\n   - Direct SDK calls: `variation()`, `boolVariation()`, `useFlags()`, etc.\n   - Wrapper patterns: Does this codebase abstract flags behind a service or utility?\n   - Constant definitions: Are flag keys defined as constants somewhere?\n   - See [SDK Evaluation Patterns](references\u002Fsdk-evaluation-patterns.md) for patterns by language\n\n3. **Understand conventions.** Look at existing flags to learn:\n   - **Naming convention**: Are keys `kebab-case`, `snake_case`, `camelCase`?\n   - **Organization**: Are flag keys co-located with features, or centralized in a constants file?\n   - **Default values**: What defaults do existing evaluations use?\n   - **Context\u002Fuser construction**: How does this codebase build the user\u002Fcontext object passed to the SDK? This determines which context kinds and attributes any future targeting can use — and it differs by surface (server vs client vs anonymous). See [Context Availability](..\u002Flaunchdarkly-flag-targeting\u002Freferences\u002Fcontext-availability.md) before planning a rule, individual target, or rollout.\n\n4. **Check LaunchDarkly project conventions.** Optionally use `list-flags` to see existing flags:\n   - What tags are commonly used?\n   - Are flags marked as temporary or permanent?\n   - What naming patterns exist in the project?\n\n### Step 2: Determine the Right Flag Type\n\nBased on what the user needs, choose the appropriate flag configuration. See [Flag Types and Patterns](references\u002Fflag-types.md) for the full guide.\n\n**Quick decision:**\n\n| User intent | Flag kind | Variations |\n|-------------|-----------|------------|\n| \"Toggle a feature on\u002Foff\" | `boolean` | `true` \u002F `false` |\n| \"Gradually roll out a feature\" | `boolean` | `true` \u002F `false` |\n| \"A\u002FB test between options\" | `multivariate` (string) | User-defined values |\n| \"Configure a numeric threshold\" | `multivariate` (number) | User-defined values |\n| \"Serve different config objects\" | `multivariate` (JSON) | User-defined values |\n\n**Defaults to apply:**\n- Set `temporary: true` unless the user explicitly says this is a permanent\u002Flong-lived flag. Most flags are release flags that should eventually be cleaned up.\n- Generate a `key` from the name if not provided (e.g., \"New Checkout Flow\" -> `new-checkout-flow`), but match the codebase's naming convention if one exists.\n- Suggest relevant tags based on the feature area, team, or context the user mentions.\n\n### Step 3: Create the Flag in LaunchDarkly\n\nUse `create-flag` with the configuration determined in Step 2.\n\nAfter creation:\n- The flag is created with **targeting OFF** in all environments.\n- The flag serves the `offVariation` to everyone until targeting is turned on.\n- Remind the user they'll need to use the [flag targeting skill](..\u002Flaunchdarkly-flag-targeting\u002FSKILL.md) to toggle it on and optionally set up rollout rules.\n\n### Step 4: Add Flag Evaluation to Code\n\nNow add the code to evaluate the flag, **matching the patterns you found in Step 1**.\n\n1. **Use the same SDK patterns** the codebase already uses. If there's a wrapper, use the wrapper. If there are constants, add the new key to the constants file.\n2. **Use an appropriate default value.** The default (fallback) value in code should be the \"safe\" behavior: typically the existing behavior before the flag. This ensures the feature stays off if the SDK can't reach LaunchDarkly.\n3. **Add the conditional logic.** Wrap the new behavior in a flag check.\n4. **Handle both branches.** Make sure the code path for each variation is clear and complete.\n\nSee [SDK Evaluation Patterns](references\u002Fsdk-evaluation-patterns.md) for implementation examples by language and framework.\n\n### Step 5: Verify\n\nConfirm the flag is properly set up:\n\n1. **Code compiles\u002Fpasses linting.** Run the project's build or lint step.\n2. **Flag exists in LaunchDarkly.** Use `get-flag` to confirm it was created with the right configuration.\n3. **Both code paths work.** The flag-off path preserves existing behavior; the flag-on path enables the new feature.\n4. **Default value is safe.** If LaunchDarkly is unreachable, the code falls back to the default: make sure that's the existing\u002Fsafe behavior.\n\n## Updating Flag Settings\n\nIf the user wants to change flag metadata (not targeting), use `update-flag-settings`. Supported changes:\n\n| Change | Instruction |\n|--------|-------------|\n| Rename | `{kind: \"updateName\", value: \"New Name\"}` |\n| Update description | `{kind: \"updateDescription\", value: \"New description\"}` |\n| Add tags | `{kind: \"addTags\", values: [\"tag1\", \"tag2\"]}` |\n| Remove tags | `{kind: \"removeTags\", values: [\"old-tag\"]}` |\n| Mark as temporary | `{kind: \"markTemporary\"}` |\n| Mark as permanent | `{kind: \"markPermanent\"}` |\n\nMultiple instructions can be batched in a single call. These changes are project-wide, not environment-specific.\n\n**Important:** Metadata updates (above) are separate from targeting changes (toggle, rollout, rules). If the user wants to change who sees what, direct them to the [flag targeting skill](..\u002Flaunchdarkly-flag-targeting\u002FSKILL.md).\n\n## Important Context\n\n- **Flag keys are immutable.** Once created, a flag's key cannot be changed. Choose carefully.\n- **Flags start OFF.** Creation never enables a flag. This is a safety feature.\n- **The default value in code is your safety net.** It's what gets served when the SDK can't connect to LaunchDarkly. Always use the \"safe\" \u002F existing behavior as the default.\n- **Follow existing codebase conventions.** The most common mistake is introducing a flag pattern that doesn't match what the team already does. Step 1 exists to prevent this.\n\n## References\n\n- [Flag Types and Patterns](references\u002Fflag-types.md): Boolean vs multivariate, naming conventions, configuration best practices\n- [SDK Evaluation Patterns](references\u002Fsdk-evaluation-patterns.md): How to evaluate flags in each SDK, including common wrapper patterns\n- [Context Availability](..\u002Flaunchdarkly-flag-targeting\u002Freferences\u002Fcontext-availability.md): Which context kinds\u002Fattributes targeting can use, matched to the surface where the flag is read (relevant once the flag will target rather than being a plain on\u002Foff switch)\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.1.0-experimental",{"type":43,"children":44},"root",[45,54,60,67,72,81,109,117,142,148,155,160,432,438,451,459,624,632,674,680,692,697,738,744,756,799,809,815,820,870,876,888,1012,1017,1032,1038,1081,1087],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"launchdarkly-flag-create-configure",[51],{"type":52,"value":53},"text","LaunchDarkly Flag Create & Configure",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58],{"type":52,"value":59},"You're using a skill that will guide you through introducing a new feature flag into a codebase. Your job is to explore how flags are already used in this codebase, create the flag in LaunchDarkly in a way that fits, add the evaluation code matching existing patterns, and verify everything is wired up correctly.",{"type":46,"tag":61,"props":62,"children":64},"h2",{"id":63},"prerequisites",[65],{"type":52,"value":66},"Prerequisites",{"type":46,"tag":55,"props":68,"children":69},{},[70],{"type":52,"value":71},"This skill requires the remotely hosted LaunchDarkly MCP server to be configured in your environment.",{"type":46,"tag":55,"props":73,"children":74},{},[75],{"type":46,"tag":76,"props":77,"children":78},"strong",{},[79],{"type":52,"value":80},"Required MCP tools:",{"type":46,"tag":82,"props":83,"children":84},"ul",{},[85,98],{"type":46,"tag":86,"props":87,"children":88},"li",{},[89,96],{"type":46,"tag":90,"props":91,"children":93},"code",{"className":92},[],[94],{"type":52,"value":95},"create-flag",{"type":52,"value":97},": create a new feature flag in a project",{"type":46,"tag":86,"props":99,"children":100},{},[101,107],{"type":46,"tag":90,"props":102,"children":104},{"className":103},[],[105],{"type":52,"value":106},"get-flag",{"type":52,"value":108},": verify the flag was created correctly",{"type":46,"tag":55,"props":110,"children":111},{},[112],{"type":46,"tag":76,"props":113,"children":114},{},[115],{"type":52,"value":116},"Optional MCP tools (enhance workflow):",{"type":46,"tag":82,"props":118,"children":119},{},[120,131],{"type":46,"tag":86,"props":121,"children":122},{},[123,129],{"type":46,"tag":90,"props":124,"children":126},{"className":125},[],[127],{"type":52,"value":128},"list-flags",{"type":52,"value":130},": browse existing flags to understand naming conventions and tags",{"type":46,"tag":86,"props":132,"children":133},{},[134,140],{"type":46,"tag":90,"props":135,"children":137},{"className":136},[],[138],{"type":52,"value":139},"update-flag-settings",{"type":52,"value":141},": update flag metadata (name, description, tags, temporary\u002Fpermanent status)",{"type":46,"tag":61,"props":143,"children":145},{"id":144},"workflow",[146],{"type":52,"value":147},"Workflow",{"type":46,"tag":149,"props":150,"children":152},"h3",{"id":151},"step-1-explore-the-codebase",[153],{"type":52,"value":154},"Step 1: Explore the Codebase",{"type":46,"tag":55,"props":156,"children":157},{},[158],{"type":52,"value":159},"Before creating anything, understand how this codebase uses feature flags.",{"type":46,"tag":161,"props":162,"children":163},"ol",{},[164,250,314,397],{"type":46,"tag":86,"props":165,"children":166},{},[167,172,174],{"type":46,"tag":76,"props":168,"children":169},{},[170],{"type":52,"value":171},"Find the SDK.",{"type":52,"value":173}," Search for LaunchDarkly SDK imports or initialization:",{"type":46,"tag":82,"props":175,"children":176},{},[177,211,245],{"type":46,"tag":86,"props":178,"children":179},{},[180,182,187,189,195,196,202,203,209],{"type":52,"value":181},"Look for ",{"type":46,"tag":90,"props":183,"children":185},{"className":184},[],[186],{"type":52,"value":8},{"type":52,"value":188},", ",{"type":46,"tag":90,"props":190,"children":192},{"className":191},[],[193],{"type":52,"value":194},"ldclient",{"type":52,"value":188},{"type":46,"tag":90,"props":197,"children":199},{"className":198},[],[200],{"type":52,"value":201},"ld-client",{"type":52,"value":188},{"type":46,"tag":90,"props":204,"children":206},{"className":205},[],[207],{"type":52,"value":208},"LDClient",{"type":52,"value":210}," in imports",{"type":46,"tag":86,"props":212,"children":213},{},[214,216,222,223,229,230,236,237,243],{"type":52,"value":215},"Check ",{"type":46,"tag":90,"props":217,"children":219},{"className":218},[],[220],{"type":52,"value":221},"package.json",{"type":52,"value":188},{"type":46,"tag":90,"props":224,"children":226},{"className":225},[],[227],{"type":52,"value":228},"requirements.txt",{"type":52,"value":188},{"type":46,"tag":90,"props":231,"children":233},{"className":232},[],[234],{"type":52,"value":235},"go.mod",{"type":52,"value":188},{"type":46,"tag":90,"props":238,"children":240},{"className":239},[],[241],{"type":52,"value":242},"Gemfile",{"type":52,"value":244},", or equivalent for the SDK dependency",{"type":46,"tag":86,"props":246,"children":247},{},[248],{"type":52,"value":249},"Identify which SDK is in use (server-side Node, React, Python, Go, Java, etc.)",{"type":46,"tag":86,"props":251,"children":252},{},[253,258,260],{"type":46,"tag":76,"props":254,"children":255},{},[256],{"type":52,"value":257},"Find existing flag evaluations.",{"type":52,"value":259}," Search for variation calls to understand the patterns this codebase uses:",{"type":46,"tag":82,"props":261,"children":262},{},[263,290,295,300],{"type":46,"tag":86,"props":264,"children":265},{},[266,268,274,275,281,282,288],{"type":52,"value":267},"Direct SDK calls: ",{"type":46,"tag":90,"props":269,"children":271},{"className":270},[],[272],{"type":52,"value":273},"variation()",{"type":52,"value":188},{"type":46,"tag":90,"props":276,"children":278},{"className":277},[],[279],{"type":52,"value":280},"boolVariation()",{"type":52,"value":188},{"type":46,"tag":90,"props":283,"children":285},{"className":284},[],[286],{"type":52,"value":287},"useFlags()",{"type":52,"value":289},", etc.",{"type":46,"tag":86,"props":291,"children":292},{},[293],{"type":52,"value":294},"Wrapper patterns: Does this codebase abstract flags behind a service or utility?",{"type":46,"tag":86,"props":296,"children":297},{},[298],{"type":52,"value":299},"Constant definitions: Are flag keys defined as constants somewhere?",{"type":46,"tag":86,"props":301,"children":302},{},[303,305,312],{"type":52,"value":304},"See ",{"type":46,"tag":306,"props":307,"children":309},"a",{"href":308},"references\u002Fsdk-evaluation-patterns.md",[310],{"type":52,"value":311},"SDK Evaluation Patterns",{"type":52,"value":313}," for patterns by language",{"type":46,"tag":86,"props":315,"children":316},{},[317,322,324],{"type":46,"tag":76,"props":318,"children":319},{},[320],{"type":52,"value":321},"Understand conventions.",{"type":52,"value":323}," Look at existing flags to learn:",{"type":46,"tag":82,"props":325,"children":326},{},[327,359,369,379],{"type":46,"tag":86,"props":328,"children":329},{},[330,335,337,343,344,350,351,357],{"type":46,"tag":76,"props":331,"children":332},{},[333],{"type":52,"value":334},"Naming convention",{"type":52,"value":336},": Are keys ",{"type":46,"tag":90,"props":338,"children":340},{"className":339},[],[341],{"type":52,"value":342},"kebab-case",{"type":52,"value":188},{"type":46,"tag":90,"props":345,"children":347},{"className":346},[],[348],{"type":52,"value":349},"snake_case",{"type":52,"value":188},{"type":46,"tag":90,"props":352,"children":354},{"className":353},[],[355],{"type":52,"value":356},"camelCase",{"type":52,"value":358},"?",{"type":46,"tag":86,"props":360,"children":361},{},[362,367],{"type":46,"tag":76,"props":363,"children":364},{},[365],{"type":52,"value":366},"Organization",{"type":52,"value":368},": Are flag keys co-located with features, or centralized in a constants file?",{"type":46,"tag":86,"props":370,"children":371},{},[372,377],{"type":46,"tag":76,"props":373,"children":374},{},[375],{"type":52,"value":376},"Default values",{"type":52,"value":378},": What defaults do existing evaluations use?",{"type":46,"tag":86,"props":380,"children":381},{},[382,387,389,395],{"type":46,"tag":76,"props":383,"children":384},{},[385],{"type":52,"value":386},"Context\u002Fuser construction",{"type":52,"value":388},": How does this codebase build the user\u002Fcontext object passed to the SDK? This determines which context kinds and attributes any future targeting can use — and it differs by surface (server vs client vs anonymous). See ",{"type":46,"tag":306,"props":390,"children":392},{"href":391},"..\u002Flaunchdarkly-flag-targeting\u002Freferences\u002Fcontext-availability.md",[393],{"type":52,"value":394},"Context Availability",{"type":52,"value":396}," before planning a rule, individual target, or rollout.",{"type":46,"tag":86,"props":398,"children":399},{},[400,405,407,412,414],{"type":46,"tag":76,"props":401,"children":402},{},[403],{"type":52,"value":404},"Check LaunchDarkly project conventions.",{"type":52,"value":406}," Optionally use ",{"type":46,"tag":90,"props":408,"children":410},{"className":409},[],[411],{"type":52,"value":128},{"type":52,"value":413}," to see existing flags:",{"type":46,"tag":82,"props":415,"children":416},{},[417,422,427],{"type":46,"tag":86,"props":418,"children":419},{},[420],{"type":52,"value":421},"What tags are commonly used?",{"type":46,"tag":86,"props":423,"children":424},{},[425],{"type":52,"value":426},"Are flags marked as temporary or permanent?",{"type":46,"tag":86,"props":428,"children":429},{},[430],{"type":52,"value":431},"What naming patterns exist in the project?",{"type":46,"tag":149,"props":433,"children":435},{"id":434},"step-2-determine-the-right-flag-type",[436],{"type":52,"value":437},"Step 2: Determine the Right Flag Type",{"type":46,"tag":55,"props":439,"children":440},{},[441,443,449],{"type":52,"value":442},"Based on what the user needs, choose the appropriate flag configuration. See ",{"type":46,"tag":306,"props":444,"children":446},{"href":445},"references\u002Fflag-types.md",[447],{"type":52,"value":448},"Flag Types and Patterns",{"type":52,"value":450}," for the full guide.",{"type":46,"tag":55,"props":452,"children":453},{},[454],{"type":46,"tag":76,"props":455,"children":456},{},[457],{"type":52,"value":458},"Quick decision:",{"type":46,"tag":460,"props":461,"children":462},"table",{},[463,487],{"type":46,"tag":464,"props":465,"children":466},"thead",{},[467],{"type":46,"tag":468,"props":469,"children":470},"tr",{},[471,477,482],{"type":46,"tag":472,"props":473,"children":474},"th",{},[475],{"type":52,"value":476},"User intent",{"type":46,"tag":472,"props":478,"children":479},{},[480],{"type":52,"value":481},"Flag kind",{"type":46,"tag":472,"props":483,"children":484},{},[485],{"type":52,"value":486},"Variations",{"type":46,"tag":488,"props":489,"children":490},"tbody",{},[491,526,556,580,602],{"type":46,"tag":468,"props":492,"children":493},{},[494,500,509],{"type":46,"tag":495,"props":496,"children":497},"td",{},[498],{"type":52,"value":499},"\"Toggle a feature on\u002Foff\"",{"type":46,"tag":495,"props":501,"children":502},{},[503],{"type":46,"tag":90,"props":504,"children":506},{"className":505},[],[507],{"type":52,"value":508},"boolean",{"type":46,"tag":495,"props":510,"children":511},{},[512,518,520],{"type":46,"tag":90,"props":513,"children":515},{"className":514},[],[516],{"type":52,"value":517},"true",{"type":52,"value":519}," \u002F ",{"type":46,"tag":90,"props":521,"children":523},{"className":522},[],[524],{"type":52,"value":525},"false",{"type":46,"tag":468,"props":527,"children":528},{},[529,534,542],{"type":46,"tag":495,"props":530,"children":531},{},[532],{"type":52,"value":533},"\"Gradually roll out a feature\"",{"type":46,"tag":495,"props":535,"children":536},{},[537],{"type":46,"tag":90,"props":538,"children":540},{"className":539},[],[541],{"type":52,"value":508},{"type":46,"tag":495,"props":543,"children":544},{},[545,550,551],{"type":46,"tag":90,"props":546,"children":548},{"className":547},[],[549],{"type":52,"value":517},{"type":52,"value":519},{"type":46,"tag":90,"props":552,"children":554},{"className":553},[],[555],{"type":52,"value":525},{"type":46,"tag":468,"props":557,"children":558},{},[559,564,575],{"type":46,"tag":495,"props":560,"children":561},{},[562],{"type":52,"value":563},"\"A\u002FB test between options\"",{"type":46,"tag":495,"props":565,"children":566},{},[567,573],{"type":46,"tag":90,"props":568,"children":570},{"className":569},[],[571],{"type":52,"value":572},"multivariate",{"type":52,"value":574}," (string)",{"type":46,"tag":495,"props":576,"children":577},{},[578],{"type":52,"value":579},"User-defined values",{"type":46,"tag":468,"props":581,"children":582},{},[583,588,598],{"type":46,"tag":495,"props":584,"children":585},{},[586],{"type":52,"value":587},"\"Configure a numeric threshold\"",{"type":46,"tag":495,"props":589,"children":590},{},[591,596],{"type":46,"tag":90,"props":592,"children":594},{"className":593},[],[595],{"type":52,"value":572},{"type":52,"value":597}," (number)",{"type":46,"tag":495,"props":599,"children":600},{},[601],{"type":52,"value":579},{"type":46,"tag":468,"props":603,"children":604},{},[605,610,620],{"type":46,"tag":495,"props":606,"children":607},{},[608],{"type":52,"value":609},"\"Serve different config objects\"",{"type":46,"tag":495,"props":611,"children":612},{},[613,618],{"type":46,"tag":90,"props":614,"children":616},{"className":615},[],[617],{"type":52,"value":572},{"type":52,"value":619}," (JSON)",{"type":46,"tag":495,"props":621,"children":622},{},[623],{"type":52,"value":579},{"type":46,"tag":55,"props":625,"children":626},{},[627],{"type":46,"tag":76,"props":628,"children":629},{},[630],{"type":52,"value":631},"Defaults to apply:",{"type":46,"tag":82,"props":633,"children":634},{},[635,648,669],{"type":46,"tag":86,"props":636,"children":637},{},[638,640,646],{"type":52,"value":639},"Set ",{"type":46,"tag":90,"props":641,"children":643},{"className":642},[],[644],{"type":52,"value":645},"temporary: true",{"type":52,"value":647}," unless the user explicitly says this is a permanent\u002Flong-lived flag. Most flags are release flags that should eventually be cleaned up.",{"type":46,"tag":86,"props":649,"children":650},{},[651,653,659,661,667],{"type":52,"value":652},"Generate a ",{"type":46,"tag":90,"props":654,"children":656},{"className":655},[],[657],{"type":52,"value":658},"key",{"type":52,"value":660}," from the name if not provided (e.g., \"New Checkout Flow\" -> ",{"type":46,"tag":90,"props":662,"children":664},{"className":663},[],[665],{"type":52,"value":666},"new-checkout-flow",{"type":52,"value":668},"), but match the codebase's naming convention if one exists.",{"type":46,"tag":86,"props":670,"children":671},{},[672],{"type":52,"value":673},"Suggest relevant tags based on the feature area, team, or context the user mentions.",{"type":46,"tag":149,"props":675,"children":677},{"id":676},"step-3-create-the-flag-in-launchdarkly",[678],{"type":52,"value":679},"Step 3: Create the Flag in LaunchDarkly",{"type":46,"tag":55,"props":681,"children":682},{},[683,685,690],{"type":52,"value":684},"Use ",{"type":46,"tag":90,"props":686,"children":688},{"className":687},[],[689],{"type":52,"value":95},{"type":52,"value":691}," with the configuration determined in Step 2.",{"type":46,"tag":55,"props":693,"children":694},{},[695],{"type":52,"value":696},"After creation:",{"type":46,"tag":82,"props":698,"children":699},{},[700,712,725],{"type":46,"tag":86,"props":701,"children":702},{},[703,705,710],{"type":52,"value":704},"The flag is created with ",{"type":46,"tag":76,"props":706,"children":707},{},[708],{"type":52,"value":709},"targeting OFF",{"type":52,"value":711}," in all environments.",{"type":46,"tag":86,"props":713,"children":714},{},[715,717,723],{"type":52,"value":716},"The flag serves the ",{"type":46,"tag":90,"props":718,"children":720},{"className":719},[],[721],{"type":52,"value":722},"offVariation",{"type":52,"value":724}," to everyone until targeting is turned on.",{"type":46,"tag":86,"props":726,"children":727},{},[728,730,736],{"type":52,"value":729},"Remind the user they'll need to use the ",{"type":46,"tag":306,"props":731,"children":733},{"href":732},"..\u002Flaunchdarkly-flag-targeting\u002FSKILL.md",[734],{"type":52,"value":735},"flag targeting skill",{"type":52,"value":737}," to toggle it on and optionally set up rollout rules.",{"type":46,"tag":149,"props":739,"children":741},{"id":740},"step-4-add-flag-evaluation-to-code",[742],{"type":52,"value":743},"Step 4: Add Flag Evaluation to Code",{"type":46,"tag":55,"props":745,"children":746},{},[747,749,754],{"type":52,"value":748},"Now add the code to evaluate the flag, ",{"type":46,"tag":76,"props":750,"children":751},{},[752],{"type":52,"value":753},"matching the patterns you found in Step 1",{"type":52,"value":755},".",{"type":46,"tag":161,"props":757,"children":758},{},[759,769,779,789],{"type":46,"tag":86,"props":760,"children":761},{},[762,767],{"type":46,"tag":76,"props":763,"children":764},{},[765],{"type":52,"value":766},"Use the same SDK patterns",{"type":52,"value":768}," the codebase already uses. If there's a wrapper, use the wrapper. If there are constants, add the new key to the constants file.",{"type":46,"tag":86,"props":770,"children":771},{},[772,777],{"type":46,"tag":76,"props":773,"children":774},{},[775],{"type":52,"value":776},"Use an appropriate default value.",{"type":52,"value":778}," The default (fallback) value in code should be the \"safe\" behavior: typically the existing behavior before the flag. This ensures the feature stays off if the SDK can't reach LaunchDarkly.",{"type":46,"tag":86,"props":780,"children":781},{},[782,787],{"type":46,"tag":76,"props":783,"children":784},{},[785],{"type":52,"value":786},"Add the conditional logic.",{"type":52,"value":788}," Wrap the new behavior in a flag check.",{"type":46,"tag":86,"props":790,"children":791},{},[792,797],{"type":46,"tag":76,"props":793,"children":794},{},[795],{"type":52,"value":796},"Handle both branches.",{"type":52,"value":798}," Make sure the code path for each variation is clear and complete.",{"type":46,"tag":55,"props":800,"children":801},{},[802,803,807],{"type":52,"value":304},{"type":46,"tag":306,"props":804,"children":805},{"href":308},[806],{"type":52,"value":311},{"type":52,"value":808}," for implementation examples by language and framework.",{"type":46,"tag":149,"props":810,"children":812},{"id":811},"step-5-verify",[813],{"type":52,"value":814},"Step 5: Verify",{"type":46,"tag":55,"props":816,"children":817},{},[818],{"type":52,"value":819},"Confirm the flag is properly set up:",{"type":46,"tag":161,"props":821,"children":822},{},[823,833,850,860],{"type":46,"tag":86,"props":824,"children":825},{},[826,831],{"type":46,"tag":76,"props":827,"children":828},{},[829],{"type":52,"value":830},"Code compiles\u002Fpasses linting.",{"type":52,"value":832}," Run the project's build or lint step.",{"type":46,"tag":86,"props":834,"children":835},{},[836,841,843,848],{"type":46,"tag":76,"props":837,"children":838},{},[839],{"type":52,"value":840},"Flag exists in LaunchDarkly.",{"type":52,"value":842}," Use ",{"type":46,"tag":90,"props":844,"children":846},{"className":845},[],[847],{"type":52,"value":106},{"type":52,"value":849}," to confirm it was created with the right configuration.",{"type":46,"tag":86,"props":851,"children":852},{},[853,858],{"type":46,"tag":76,"props":854,"children":855},{},[856],{"type":52,"value":857},"Both code paths work.",{"type":52,"value":859}," The flag-off path preserves existing behavior; the flag-on path enables the new feature.",{"type":46,"tag":86,"props":861,"children":862},{},[863,868],{"type":46,"tag":76,"props":864,"children":865},{},[866],{"type":52,"value":867},"Default value is safe.",{"type":52,"value":869}," If LaunchDarkly is unreachable, the code falls back to the default: make sure that's the existing\u002Fsafe behavior.",{"type":46,"tag":61,"props":871,"children":873},{"id":872},"updating-flag-settings",[874],{"type":52,"value":875},"Updating Flag Settings",{"type":46,"tag":55,"props":877,"children":878},{},[879,881,886],{"type":52,"value":880},"If the user wants to change flag metadata (not targeting), use ",{"type":46,"tag":90,"props":882,"children":884},{"className":883},[],[885],{"type":52,"value":139},{"type":52,"value":887},". Supported changes:",{"type":46,"tag":460,"props":889,"children":890},{},[891,907],{"type":46,"tag":464,"props":892,"children":893},{},[894],{"type":46,"tag":468,"props":895,"children":896},{},[897,902],{"type":46,"tag":472,"props":898,"children":899},{},[900],{"type":52,"value":901},"Change",{"type":46,"tag":472,"props":903,"children":904},{},[905],{"type":52,"value":906},"Instruction",{"type":46,"tag":488,"props":908,"children":909},{},[910,927,944,961,978,995],{"type":46,"tag":468,"props":911,"children":912},{},[913,918],{"type":46,"tag":495,"props":914,"children":915},{},[916],{"type":52,"value":917},"Rename",{"type":46,"tag":495,"props":919,"children":920},{},[921],{"type":46,"tag":90,"props":922,"children":924},{"className":923},[],[925],{"type":52,"value":926},"{kind: \"updateName\", value: \"New Name\"}",{"type":46,"tag":468,"props":928,"children":929},{},[930,935],{"type":46,"tag":495,"props":931,"children":932},{},[933],{"type":52,"value":934},"Update description",{"type":46,"tag":495,"props":936,"children":937},{},[938],{"type":46,"tag":90,"props":939,"children":941},{"className":940},[],[942],{"type":52,"value":943},"{kind: \"updateDescription\", value: \"New description\"}",{"type":46,"tag":468,"props":945,"children":946},{},[947,952],{"type":46,"tag":495,"props":948,"children":949},{},[950],{"type":52,"value":951},"Add tags",{"type":46,"tag":495,"props":953,"children":954},{},[955],{"type":46,"tag":90,"props":956,"children":958},{"className":957},[],[959],{"type":52,"value":960},"{kind: \"addTags\", values: [\"tag1\", \"tag2\"]}",{"type":46,"tag":468,"props":962,"children":963},{},[964,969],{"type":46,"tag":495,"props":965,"children":966},{},[967],{"type":52,"value":968},"Remove tags",{"type":46,"tag":495,"props":970,"children":971},{},[972],{"type":46,"tag":90,"props":973,"children":975},{"className":974},[],[976],{"type":52,"value":977},"{kind: \"removeTags\", values: [\"old-tag\"]}",{"type":46,"tag":468,"props":979,"children":980},{},[981,986],{"type":46,"tag":495,"props":982,"children":983},{},[984],{"type":52,"value":985},"Mark as temporary",{"type":46,"tag":495,"props":987,"children":988},{},[989],{"type":46,"tag":90,"props":990,"children":992},{"className":991},[],[993],{"type":52,"value":994},"{kind: \"markTemporary\"}",{"type":46,"tag":468,"props":996,"children":997},{},[998,1003],{"type":46,"tag":495,"props":999,"children":1000},{},[1001],{"type":52,"value":1002},"Mark as permanent",{"type":46,"tag":495,"props":1004,"children":1005},{},[1006],{"type":46,"tag":90,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":52,"value":1011},"{kind: \"markPermanent\"}",{"type":46,"tag":55,"props":1013,"children":1014},{},[1015],{"type":52,"value":1016},"Multiple instructions can be batched in a single call. These changes are project-wide, not environment-specific.",{"type":46,"tag":55,"props":1018,"children":1019},{},[1020,1025,1027,1031],{"type":46,"tag":76,"props":1021,"children":1022},{},[1023],{"type":52,"value":1024},"Important:",{"type":52,"value":1026}," Metadata updates (above) are separate from targeting changes (toggle, rollout, rules). If the user wants to change who sees what, direct them to the ",{"type":46,"tag":306,"props":1028,"children":1029},{"href":732},[1030],{"type":52,"value":735},{"type":52,"value":755},{"type":46,"tag":61,"props":1033,"children":1035},{"id":1034},"important-context",[1036],{"type":52,"value":1037},"Important Context",{"type":46,"tag":82,"props":1039,"children":1040},{},[1041,1051,1061,1071],{"type":46,"tag":86,"props":1042,"children":1043},{},[1044,1049],{"type":46,"tag":76,"props":1045,"children":1046},{},[1047],{"type":52,"value":1048},"Flag keys are immutable.",{"type":52,"value":1050}," Once created, a flag's key cannot be changed. Choose carefully.",{"type":46,"tag":86,"props":1052,"children":1053},{},[1054,1059],{"type":46,"tag":76,"props":1055,"children":1056},{},[1057],{"type":52,"value":1058},"Flags start OFF.",{"type":52,"value":1060}," Creation never enables a flag. This is a safety feature.",{"type":46,"tag":86,"props":1062,"children":1063},{},[1064,1069],{"type":46,"tag":76,"props":1065,"children":1066},{},[1067],{"type":52,"value":1068},"The default value in code is your safety net.",{"type":52,"value":1070}," It's what gets served when the SDK can't connect to LaunchDarkly. Always use the \"safe\" \u002F existing behavior as the default.",{"type":46,"tag":86,"props":1072,"children":1073},{},[1074,1079],{"type":46,"tag":76,"props":1075,"children":1076},{},[1077],{"type":52,"value":1078},"Follow existing codebase conventions.",{"type":52,"value":1080}," The most common mistake is introducing a flag pattern that doesn't match what the team already does. Step 1 exists to prevent this.",{"type":46,"tag":61,"props":1082,"children":1084},{"id":1083},"references",[1085],{"type":52,"value":1086},"References",{"type":46,"tag":82,"props":1088,"children":1089},{},[1090,1099,1108],{"type":46,"tag":86,"props":1091,"children":1092},{},[1093,1097],{"type":46,"tag":306,"props":1094,"children":1095},{"href":445},[1096],{"type":52,"value":448},{"type":52,"value":1098},": Boolean vs multivariate, naming conventions, configuration best practices",{"type":46,"tag":86,"props":1100,"children":1101},{},[1102,1106],{"type":46,"tag":306,"props":1103,"children":1104},{"href":308},[1105],{"type":52,"value":311},{"type":52,"value":1107},": How to evaluate flags in each SDK, including common wrapper patterns",{"type":46,"tag":86,"props":1109,"children":1110},{},[1111,1115],{"type":46,"tag":306,"props":1112,"children":1113},{"href":391},[1114],{"type":52,"value":394},{"type":52,"value":1116},": Which context kinds\u002Fattributes targeting can use, matched to the surface where the flag is read (relevant once the flag will target rather than being a plain on\u002Foff switch)",{"items":1118,"total":1250},[1119,1136,1145,1159,1170,1180,1188,1202,1213,1222,1232,1241],{"slug":1120,"name":1120,"fn":1121,"description":1122,"org":1123,"tags":1124,"stars":23,"repoUrl":24,"updatedAt":1135},"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},[1125,1128,1131,1132],{"name":1126,"slug":1127,"type":15},"Agents","agents",{"name":1129,"slug":1130,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":1133,"slug":1134,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1137,"name":1137,"fn":1138,"description":1139,"org":1140,"tags":1141,"stars":23,"repoUrl":24,"updatedAt":1144},"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},[1142,1143],{"name":1126,"slug":1127,"type":15},{"name":1129,"slug":1130,"type":15},"2026-05-22T06:55:56.527064",{"slug":1146,"name":1146,"fn":1147,"description":1148,"org":1149,"tags":1150,"stars":23,"repoUrl":24,"updatedAt":1158},"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},[1151,1154,1155],{"name":1152,"slug":1153,"type":15},"Analytics","analytics",{"name":9,"slug":8,"type":15},{"name":1156,"slug":1157,"type":15},"Metrics","metrics","2026-05-22T06:55:53.858749",{"slug":1160,"name":1160,"fn":1161,"description":1162,"org":1163,"tags":1164,"stars":23,"repoUrl":24,"updatedAt":1169},"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},[1165,1166],{"name":9,"slug":8,"type":15},{"name":1167,"slug":1168,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1171,"name":1171,"fn":1172,"description":1173,"org":1174,"tags":1175,"stars":23,"repoUrl":24,"updatedAt":1179},"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},[1176,1177,1178],{"name":1152,"slug":1153,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1181,"name":1181,"fn":1182,"description":1183,"org":1184,"tags":1185,"stars":23,"repoUrl":24,"updatedAt":1187},"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},[1186],{"name":1167,"slug":1168,"type":15},"2026-05-22T06:55:44.464733",{"slug":1189,"name":1189,"fn":1190,"description":1191,"org":1192,"tags":1193,"stars":23,"repoUrl":24,"updatedAt":1201},"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},[1194,1197,1198],{"name":1195,"slug":1196,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1199,"slug":1200,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",{"slug":1203,"name":1203,"fn":1204,"description":1205,"org":1206,"tags":1207,"stars":23,"repoUrl":24,"updatedAt":1212},"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},[1208,1211],{"name":1209,"slug":1210,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1214,"name":1214,"fn":1215,"description":1216,"org":1217,"tags":1218,"stars":23,"repoUrl":24,"updatedAt":1221},"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},[1219,1220],{"name":1209,"slug":1210,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1223,"name":1223,"fn":1224,"description":1225,"org":1226,"tags":1227,"stars":23,"repoUrl":24,"updatedAt":1231},"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},[1228,1229,1230],{"name":1209,"slug":1210,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1233,"name":1233,"fn":1234,"description":1235,"org":1236,"tags":1237,"stars":23,"repoUrl":24,"updatedAt":1240},"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},[1238,1239],{"name":9,"slug":8,"type":15},{"name":1167,"slug":1168,"type":15},"2026-05-22T06:55:39.13373",{"slug":1242,"name":1242,"fn":1243,"description":1244,"org":1245,"tags":1246,"stars":23,"repoUrl":24,"updatedAt":1249},"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},[1247,1248],{"name":9,"slug":8,"type":15},{"name":1167,"slug":1168,"type":15},"2026-05-22T06:55:40.464884",49,{"items":1252,"total":1250},[1253,1260,1265,1271,1276,1282,1286],{"slug":1120,"name":1120,"fn":1121,"description":1122,"org":1254,"tags":1255,"stars":23,"repoUrl":24,"updatedAt":1135},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1256,1257,1258,1259],{"name":1126,"slug":1127,"type":15},{"name":1129,"slug":1130,"type":15},{"name":9,"slug":8,"type":15},{"name":1133,"slug":1134,"type":15},{"slug":1137,"name":1137,"fn":1138,"description":1139,"org":1261,"tags":1262,"stars":23,"repoUrl":24,"updatedAt":1144},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1263,1264],{"name":1126,"slug":1127,"type":15},{"name":1129,"slug":1130,"type":15},{"slug":1146,"name":1146,"fn":1147,"description":1148,"org":1266,"tags":1267,"stars":23,"repoUrl":24,"updatedAt":1158},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1268,1269,1270],{"name":1152,"slug":1153,"type":15},{"name":9,"slug":8,"type":15},{"name":1156,"slug":1157,"type":15},{"slug":1160,"name":1160,"fn":1161,"description":1162,"org":1272,"tags":1273,"stars":23,"repoUrl":24,"updatedAt":1169},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1274,1275],{"name":9,"slug":8,"type":15},{"name":1167,"slug":1168,"type":15},{"slug":1171,"name":1171,"fn":1172,"description":1173,"org":1277,"tags":1278,"stars":23,"repoUrl":24,"updatedAt":1179},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1279,1280,1281],{"name":1152,"slug":1153,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1181,"name":1181,"fn":1182,"description":1183,"org":1283,"tags":1284,"stars":23,"repoUrl":24,"updatedAt":1187},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1285],{"name":1167,"slug":1168,"type":15},{"slug":1189,"name":1189,"fn":1190,"description":1191,"org":1287,"tags":1288,"stars":23,"repoUrl":24,"updatedAt":1201},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1289,1290,1291],{"name":1195,"slug":1196,"type":15},{"name":9,"slug":8,"type":15},{"name":1199,"slug":1200,"type":15}]