[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-flag-and-release-change":3,"mdc--5ek0ls-key":37,"related-repo-launchdarkly-flag-and-release-change":1223,"related-org-launchdarkly-flag-and-release-change":1309},{"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},"flag-and-release-change","implement and release feature-flagged changes","Drive a pull request's change end to end: decide it's flag-worthy, create the guarding flag, wire the new code path behind it on the PR branch, and record an automated release so the change ships safely when the PR merges. A portable orchestrator that composes should-flag-change, launchdarkly-flag-create, and flag-release. Keywords: flag a PR, wrap change in a flag, dark launch, kill switch, auto-release, automated rollout, end-to-end flag workflow.",{"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},"Automation","automation","tag",{"name":17,"slug":18,"type":15},"Feature Flags","feature-flags",{"name":20,"slug":21,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},20,"https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling","2026-07-24T06:08:58.256514","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\u002Fflag-and-release-change","---\nname: flag-and-release-change\ndescription: \"Drive a pull request's change end to end: decide it's flag-worthy, create the guarding flag, wire the new code path behind it on the PR branch, and record an automated release so the change ships safely when the PR merges. A portable orchestrator that composes should-flag-change, launchdarkly-flag-create, and flag-release. Keywords: flag a PR, wrap change in a flag, dark launch, kill switch, auto-release, automated rollout, end-to-end flag workflow.\"\nlicense: Apache-2.0\ncompatibility: Requires the remotely hosted LaunchDarkly MCP server and a git CLI with access to the PR's repository\nmetadata:\n  author: launchdarkly\n  version: \"0.1.0\"\n---\n\n# Flag & Release a PR Change\n\nYou're using a skill that takes a pull request whose change should ship behind a feature flag and drives it end to end: decide it needs a flag, create the guarding flag, wire the new behavior behind it on the PR's branch, and record an **automated release** so the change ships safely once the PR merges.\n\n**The deploy is not the release.** The merge ships the control path — the flag is created OFF, so deployment always serves the pre-change behavior. The *release* is the flag operation the automated rollout performs afterward, governed by the environment's policy. Creating the flag OFF and recording the release are deliberately separate things.\n\nThis skill is a **portable PR orchestrator**. It doesn't own the flag mechanics or the release mechanics — it composes three focused skills and adds the PR workflow (read the diff, work in a clone, push to the branch) plus the plan→implement sequencing:\n\n| Step | Owned by | This skill's role |\n|------|----------|-------------------|\n| Decide *whether* to flag | [`should-flag-change`](..\u002Fshould-flag-change\u002FSKILL.md) (advisory, read-only) | Act on a \"yes\"; make the call yourself if it wasn't run |\n| Create the flag + wire the code | [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md) | Invoke it against the change; don't re-teach flag creation or SDK patterns |\n| Record the release | [`flag-release`](..\u002Fflag-release\u002FSKILL.md) | Hand off once the flag exists and the code is pushed; don't re-teach rollout mechanics |\n\nDon't duplicate any composed skill's mechanics here. This skill's only unique content is the **PR wrapper** (clone, three-dot diff, commit\u002Fpush to the branch) and the **plan→implement** flow that stitches the three together.\n\n> **Automation note.** An orchestrating harness (e.g. a PR pipeline) can skip this skill and invoke the three composed skills directly — `should-flag-change` → `launchdarkly-flag-create` → `flag-release` — driving the git and sequencing itself. This skill is the portable, human-in-the-loop path for a developer working a PR by hand.\n\nYou work in two phases — **plan**, then **implement** — and you check in with the user in between. **Never create or modify anything during the plan phase.**\n\n## Prerequisites\n\n- The remotely hosted LaunchDarkly MCP server.\n- A `git` CLI that can read and push to the PR's repository.\n- The composed skills available: [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md) (flag creation + code wiring) and [`flag-release`](..\u002Fflag-release\u002FSKILL.md) (recording the rollout). [`should-flag-change`](..\u002Fshould-flag-change\u002FSKILL.md) is used if the flag decision hasn't been made.\n\nMCP tools are used *via the composed skills* — `create-flag`\u002F`get-flag` through flag-create, `match-release-policies`\u002F`create-automated-rollout-config` through flag-release. This skill calls none directly.\n\n## Working With the Pull Request\n\nWork from a clone so you can read the change and push the flag wiring back to its branch. Credentials are provided by the environment — never ask for, print, or store tokens.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>.git && cd \u003Crepo>\ngit fetch origin pull\u002F\u003Cpr_number>\u002Fhead\ngit diff origin\u002FHEAD...\u003Chead_sha>       # three-dot: change relative to the PR's base\n```\n\nThe three-dot diff (`base...head`) shows exactly what the PR introduces. Read the changed files you need to understand the change and its risk. Stay in this clone through both phases — in implement you edit, commit, and push here. Full PR mechanics (clone, three-dot diff, commit\u002Fpush to the branch): [references\u002Fpr-wiring.md](references\u002Fpr-wiring.md).\n\n## Plan Phase\n\n**Create nothing in this phase.**\n\n1. **Confirm it should be flagged.** If [`should-flag-change`](..\u002Fshould-flag-change\u002FSKILL.md) already ran, act on its verdict. Otherwise apply the same judgment: favor a flag for user-facing or risky changes; skip config-only, dependency-bump, infra, test-only, or docs changes. If a flag clearly isn't warranted, say so and stop.\n2. **Understand the change and conventions.** Read the three-dot diff and changed files — what does it do, what's the blast radius? Then follow **flag-create's Step 1** to learn how this codebase already uses flags (SDK, wrapper, key constants, naming). Don't reinvent that exploration here.\n3. **Design the flag.** Usually a single boolean kill-switch around the new path (flag-create's [flag-types](..\u002Flaunchdarkly-flag-create\u002Freferences\u002Fflag-types.md) covers the choice). Don't propose more flags than the change needs. If Step 1 (or `should-flag-change`) surfaced a **dependency on a parent flag\u002Ffeature that isn't live yet**, note it — the release step can couple them with a prerequisite.\n4. **Plan the release.** Follow [`flag-release`](..\u002Fflag-release\u002FSKILL.md)'s plan phase: pick target environments, preview each with `match-release-policies`, and capture the human's **release intent** (release on merge \u002F hold \u002F `notBefore` \u002F segment \u002F prerequisite). Don't re-derive the rollout model here — that's flag-release's job.\n5. **Present the combined plan and stop.** Summarize: the flag (`key`, `name`, boolean, tags) and why it gates *this* change; where in the code the guard goes; the per-environment release plan + captured intent (and anything to be *held*). Then wait. Revise on feedback; proceed only on clear approval. Ask a focused question if you're genuinely missing something (project key, environments, a missing policy) rather than guessing.\n\n## Implement Phase\n\nOnly after approval:\n\n1. **Create the flag and wire the code** using [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md) (its Steps 3–4): flag created OFF with the agreed key\u002Ftags, guarding evaluation added with a safe default matching the codebase's pattern. **Fail closed on creation errors:** only an \"already exists\" result is success-via-reuse. Any *other* create-flag failure (auth, permissions, not-found, server error) is a hard stop — do **not** wire the code, record the release, or report success. A false \"flag created\" yields a green PR referencing a flag that doesn't exist, worse than an honest failure. Surface the error and stop.\n2. **Add paired flag-on \u002F flag-off tests.** If the repo has a test suite, add a test for each state of the wrapped path — flag ON serves the new behavior, flag OFF preserves the old — matching the repo's framework and flag-mocking convention. Run them and continue only once green. Scope the tests to the flagged path, not general coverage. If the repo has no tests, skip and say so.\n3. **Commit and push to the PR branch.** Commit the wiring and push to the PR's existing branch so it lands in the same PR — don't open a new PR or touch the base branch. See [references\u002Fpr-wiring.md](references\u002Fpr-wiring.md).\n4. **Record the release** by handing off to [`flag-release`](..\u002Fflag-release\u002FSKILL.md)'s implement phase: it records the automated rollout, honoring the captured intent (holding any environment the intent doesn't clear) and returns a `config_id`. Don't re-teach the rollout mechanics here.\n5. **Report** the whole change: flag key + LaunchDarkly link (created OFF); the file(s)\u002Fcode path wired; the tests added; the per-environment release plan + `config_id`; what was **held** (and why) versus what releases on merge. Report only what you verified.\n\n## Edge Cases\n\n| Situation | Action |\n|-----------|--------|\n| Change isn't flag-worthy | Explain why (config-only, dep bump, infra, test-only, docs) and stop. Don't create a flag. |\n| Flag already exists | Reuse it — \"already exists\" is success. Wire the existing key; don't duplicate. |\n| Flag creation fails for any other reason (auth, permissions, 5xx) | Hard stop. Don't wire code, record a release, or claim success — surface the error. |\n| Codebase has no LaunchDarkly SDK | Wiring can't evaluate a flag — SDK install is separate ([onboarding\u002Fsdk-install](..\u002F..\u002Fonboarding\u002Fsdk-install\u002FSKILL.md)). |\n| Guarding needs more than a boolean | Prefer a boolean kill-switch. Only go multivariate if the change serves distinct variants; see flag-create's [flag-types](..\u002Flaunchdarkly-flag-create\u002Freferences\u002Fflag-types.md). |\n| Release-specific cases (hold\u002F`notBefore`, prerequisites, no matching policy, duplicate config, no useful metric) | Handled by [`flag-release`](..\u002Fflag-release\u002FSKILL.md) — see its edge cases. |\n\n## What NOT to Do\n\n- **Don't create anything in the plan phase.** Plan proposes; implement creates.\n- **Don't re-document flag creation, SDK guarding, or rollout mechanics here** — those are [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md) and [`flag-release`](..\u002Fflag-release\u002FSKILL.md). Link to them.\n- **Don't turn the flag on yourself.** The recorded release owns that; creating the flag OFF is the point.\n- **Don't over-flag.** One kill-switch beats several speculative flags.\n- **Don't handle or print credentials.** Git access is injected.\n\n## References\n\n- [references\u002Fpr-wiring.md](references\u002Fpr-wiring.md): PR mechanics — clone, three-dot diff, committing to the PR branch. *(This skill's only unique reference.)*\n- [`should-flag-change`](..\u002Fshould-flag-change\u002FSKILL.md): the flag-worthiness decision.\n- [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md): flag creation + per-SDK guarding patterns.\n- [`flag-release`](..\u002Fflag-release\u002FSKILL.md): recording the automated rollout (and its [auto-release.md](..\u002Fflag-release\u002Freferences\u002Fauto-release.md) release model).\n",{"data":38,"body":42},{"name":4,"description":6,"license":26,"compatibility":39,"metadata":40},"Requires the remotely hosted LaunchDarkly MCP server and a git CLI with access to the PR's repository",{"author":8,"version":41},"0.1.0",{"type":43,"children":44},"root",[45,54,68,86,98,220,239,273,297,304,362,405,411,416,613,633,639,647,802,808,813,932,938,1068,1074,1147,1153,1217],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"flag-release-a-pr-change",[51],{"type":52,"value":53},"text","Flag & Release a PR Change",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58,60,66],{"type":52,"value":59},"You're using a skill that takes a pull request whose change should ship behind a feature flag and drives it end to end: decide it needs a flag, create the guarding flag, wire the new behavior behind it on the PR's branch, and record an ",{"type":46,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":52,"value":65},"automated release",{"type":52,"value":67}," so the change ships safely once the PR merges.",{"type":46,"tag":55,"props":69,"children":70},{},[71,76,78,84],{"type":46,"tag":61,"props":72,"children":73},{},[74],{"type":52,"value":75},"The deploy is not the release.",{"type":52,"value":77}," The merge ships the control path — the flag is created OFF, so deployment always serves the pre-change behavior. The ",{"type":46,"tag":79,"props":80,"children":81},"em",{},[82],{"type":52,"value":83},"release",{"type":52,"value":85}," is the flag operation the automated rollout performs afterward, governed by the environment's policy. Creating the flag OFF and recording the release are deliberately separate things.",{"type":46,"tag":55,"props":87,"children":88},{},[89,91,96],{"type":52,"value":90},"This skill is a ",{"type":46,"tag":61,"props":92,"children":93},{},[94],{"type":52,"value":95},"portable PR orchestrator",{"type":52,"value":97},". It doesn't own the flag mechanics or the release mechanics — it composes three focused skills and adds the PR workflow (read the diff, work in a clone, push to the branch) plus the plan→implement sequencing:",{"type":46,"tag":99,"props":100,"children":101},"table",{},[102,126],{"type":46,"tag":103,"props":104,"children":105},"thead",{},[106],{"type":46,"tag":107,"props":108,"children":109},"tr",{},[110,116,121],{"type":46,"tag":111,"props":112,"children":113},"th",{},[114],{"type":52,"value":115},"Step",{"type":46,"tag":111,"props":117,"children":118},{},[119],{"type":52,"value":120},"Owned by",{"type":46,"tag":111,"props":122,"children":123},{},[124],{"type":52,"value":125},"This skill's role",{"type":46,"tag":127,"props":128,"children":129},"tbody",{},[130,168,194],{"type":46,"tag":107,"props":131,"children":132},{},[133,146,163],{"type":46,"tag":134,"props":135,"children":136},"td",{},[137,139,144],{"type":52,"value":138},"Decide ",{"type":46,"tag":79,"props":140,"children":141},{},[142],{"type":52,"value":143},"whether",{"type":52,"value":145}," to flag",{"type":46,"tag":134,"props":147,"children":148},{},[149,161],{"type":46,"tag":150,"props":151,"children":153},"a",{"href":152},"..\u002Fshould-flag-change\u002FSKILL.md",[154],{"type":46,"tag":155,"props":156,"children":158},"code",{"className":157},[],[159],{"type":52,"value":160},"should-flag-change",{"type":52,"value":162}," (advisory, read-only)",{"type":46,"tag":134,"props":164,"children":165},{},[166],{"type":52,"value":167},"Act on a \"yes\"; make the call yourself if it wasn't run",{"type":46,"tag":107,"props":169,"children":170},{},[171,176,189],{"type":46,"tag":134,"props":172,"children":173},{},[174],{"type":52,"value":175},"Create the flag + wire the code",{"type":46,"tag":134,"props":177,"children":178},{},[179],{"type":46,"tag":150,"props":180,"children":182},{"href":181},"..\u002Flaunchdarkly-flag-create\u002FSKILL.md",[183],{"type":46,"tag":155,"props":184,"children":186},{"className":185},[],[187],{"type":52,"value":188},"launchdarkly-flag-create",{"type":46,"tag":134,"props":190,"children":191},{},[192],{"type":52,"value":193},"Invoke it against the change; don't re-teach flag creation or SDK patterns",{"type":46,"tag":107,"props":195,"children":196},{},[197,202,215],{"type":46,"tag":134,"props":198,"children":199},{},[200],{"type":52,"value":201},"Record the release",{"type":46,"tag":134,"props":203,"children":204},{},[205],{"type":46,"tag":150,"props":206,"children":208},{"href":207},"..\u002Fflag-release\u002FSKILL.md",[209],{"type":46,"tag":155,"props":210,"children":212},{"className":211},[],[213],{"type":52,"value":214},"flag-release",{"type":46,"tag":134,"props":216,"children":217},{},[218],{"type":52,"value":219},"Hand off once the flag exists and the code is pushed; don't re-teach rollout mechanics",{"type":46,"tag":55,"props":221,"children":222},{},[223,225,230,232,237],{"type":52,"value":224},"Don't duplicate any composed skill's mechanics here. This skill's only unique content is the ",{"type":46,"tag":61,"props":226,"children":227},{},[228],{"type":52,"value":229},"PR wrapper",{"type":52,"value":231}," (clone, three-dot diff, commit\u002Fpush to the branch) and the ",{"type":46,"tag":61,"props":233,"children":234},{},[235],{"type":52,"value":236},"plan→implement",{"type":52,"value":238}," flow that stitches the three together.",{"type":46,"tag":240,"props":241,"children":242},"blockquote",{},[243],{"type":46,"tag":55,"props":244,"children":245},{},[246,251,253,258,260,265,266,271],{"type":46,"tag":61,"props":247,"children":248},{},[249],{"type":52,"value":250},"Automation note.",{"type":52,"value":252}," An orchestrating harness (e.g. a PR pipeline) can skip this skill and invoke the three composed skills directly — ",{"type":46,"tag":155,"props":254,"children":256},{"className":255},[],[257],{"type":52,"value":160},{"type":52,"value":259}," → ",{"type":46,"tag":155,"props":261,"children":263},{"className":262},[],[264],{"type":52,"value":188},{"type":52,"value":259},{"type":46,"tag":155,"props":267,"children":269},{"className":268},[],[270],{"type":52,"value":214},{"type":52,"value":272}," — driving the git and sequencing itself. This skill is the portable, human-in-the-loop path for a developer working a PR by hand.",{"type":46,"tag":55,"props":274,"children":275},{},[276,278,283,285,290,292],{"type":52,"value":277},"You work in two phases — ",{"type":46,"tag":61,"props":279,"children":280},{},[281],{"type":52,"value":282},"plan",{"type":52,"value":284},", then ",{"type":46,"tag":61,"props":286,"children":287},{},[288],{"type":52,"value":289},"implement",{"type":52,"value":291}," — and you check in with the user in between. ",{"type":46,"tag":61,"props":293,"children":294},{},[295],{"type":52,"value":296},"Never create or modify anything during the plan phase.",{"type":46,"tag":298,"props":299,"children":301},"h2",{"id":300},"prerequisites",[302],{"type":52,"value":303},"Prerequisites",{"type":46,"tag":305,"props":306,"children":307},"ul",{},[308,314,327],{"type":46,"tag":309,"props":310,"children":311},"li",{},[312],{"type":52,"value":313},"The remotely hosted LaunchDarkly MCP server.",{"type":46,"tag":309,"props":315,"children":316},{},[317,319,325],{"type":52,"value":318},"A ",{"type":46,"tag":155,"props":320,"children":322},{"className":321},[],[323],{"type":52,"value":324},"git",{"type":52,"value":326}," CLI that can read and push to the PR's repository.",{"type":46,"tag":309,"props":328,"children":329},{},[330,332,340,342,350,352,360],{"type":52,"value":331},"The composed skills available: ",{"type":46,"tag":150,"props":333,"children":334},{"href":181},[335],{"type":46,"tag":155,"props":336,"children":338},{"className":337},[],[339],{"type":52,"value":188},{"type":52,"value":341}," (flag creation + code wiring) and ",{"type":46,"tag":150,"props":343,"children":344},{"href":207},[345],{"type":46,"tag":155,"props":346,"children":348},{"className":347},[],[349],{"type":52,"value":214},{"type":52,"value":351}," (recording the rollout). ",{"type":46,"tag":150,"props":353,"children":354},{"href":152},[355],{"type":46,"tag":155,"props":356,"children":358},{"className":357},[],[359],{"type":52,"value":160},{"type":52,"value":361}," is used if the flag decision hasn't been made.",{"type":46,"tag":55,"props":363,"children":364},{},[365,367,372,374,380,382,388,390,396,397,403],{"type":52,"value":366},"MCP tools are used ",{"type":46,"tag":79,"props":368,"children":369},{},[370],{"type":52,"value":371},"via the composed skills",{"type":52,"value":373}," — ",{"type":46,"tag":155,"props":375,"children":377},{"className":376},[],[378],{"type":52,"value":379},"create-flag",{"type":52,"value":381},"\u002F",{"type":46,"tag":155,"props":383,"children":385},{"className":384},[],[386],{"type":52,"value":387},"get-flag",{"type":52,"value":389}," through flag-create, ",{"type":46,"tag":155,"props":391,"children":393},{"className":392},[],[394],{"type":52,"value":395},"match-release-policies",{"type":52,"value":381},{"type":46,"tag":155,"props":398,"children":400},{"className":399},[],[401],{"type":52,"value":402},"create-automated-rollout-config",{"type":52,"value":404}," through flag-release. This skill calls none directly.",{"type":46,"tag":298,"props":406,"children":408},{"id":407},"working-with-the-pull-request",[409],{"type":52,"value":410},"Working With the Pull Request",{"type":46,"tag":55,"props":412,"children":413},{},[414],{"type":52,"value":415},"Work from a clone so you can read the change and push the flag wiring back to its branch. Credentials are provided by the environment — never ask for, print, or store tokens.",{"type":46,"tag":417,"props":418,"children":423},"pre",{"className":419,"code":420,"language":421,"meta":422,"style":422},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>.git && cd \u003Crepo>\ngit fetch origin pull\u002F\u003Cpr_number>\u002Fhead\ngit diff origin\u002FHEAD...\u003Chead_sha>       # three-dot: change relative to the PR's base\n","bash","",[424],{"type":46,"tag":155,"props":425,"children":426},{"__ignoreMap":422},[427,527,572],{"type":46,"tag":428,"props":429,"children":432},"span",{"class":430,"line":431},"line",1,[433,438,444,449,455,460,466,471,475,479,484,489,493,498,503,509,514,518,522],{"type":46,"tag":428,"props":434,"children":436},{"style":435},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[437],{"type":52,"value":324},{"type":46,"tag":428,"props":439,"children":441},{"style":440},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[442],{"type":52,"value":443}," clone",{"type":46,"tag":428,"props":445,"children":446},{"style":440},[447],{"type":52,"value":448}," https:\u002F\u002Fgithub.com\u002F",{"type":46,"tag":428,"props":450,"children":452},{"style":451},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[453],{"type":52,"value":454},"\u003C",{"type":46,"tag":428,"props":456,"children":457},{"style":440},[458],{"type":52,"value":459},"owne",{"type":46,"tag":428,"props":461,"children":463},{"style":462},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[464],{"type":52,"value":465},"r",{"type":46,"tag":428,"props":467,"children":468},{"style":451},[469],{"type":52,"value":470},">",{"type":46,"tag":428,"props":472,"children":473},{"style":440},[474],{"type":52,"value":381},{"type":46,"tag":428,"props":476,"children":477},{"style":451},[478],{"type":52,"value":454},{"type":46,"tag":428,"props":480,"children":481},{"style":440},[482],{"type":52,"value":483},"rep",{"type":46,"tag":428,"props":485,"children":486},{"style":462},[487],{"type":52,"value":488},"o",{"type":46,"tag":428,"props":490,"children":491},{"style":451},[492],{"type":52,"value":470},{"type":46,"tag":428,"props":494,"children":495},{"style":440},[496],{"type":52,"value":497},".git",{"type":46,"tag":428,"props":499,"children":500},{"style":451},[501],{"type":52,"value":502}," &&",{"type":46,"tag":428,"props":504,"children":506},{"style":505},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[507],{"type":52,"value":508}," cd",{"type":46,"tag":428,"props":510,"children":511},{"style":451},[512],{"type":52,"value":513}," \u003C",{"type":46,"tag":428,"props":515,"children":516},{"style":440},[517],{"type":52,"value":483},{"type":46,"tag":428,"props":519,"children":520},{"style":462},[521],{"type":52,"value":488},{"type":46,"tag":428,"props":523,"children":524},{"style":451},[525],{"type":52,"value":526},">\n",{"type":46,"tag":428,"props":528,"children":530},{"class":430,"line":529},2,[531,535,540,545,550,554,559,563,567],{"type":46,"tag":428,"props":532,"children":533},{"style":435},[534],{"type":52,"value":324},{"type":46,"tag":428,"props":536,"children":537},{"style":440},[538],{"type":52,"value":539}," fetch",{"type":46,"tag":428,"props":541,"children":542},{"style":440},[543],{"type":52,"value":544}," origin",{"type":46,"tag":428,"props":546,"children":547},{"style":440},[548],{"type":52,"value":549}," pull\u002F",{"type":46,"tag":428,"props":551,"children":552},{"style":451},[553],{"type":52,"value":454},{"type":46,"tag":428,"props":555,"children":556},{"style":440},[557],{"type":52,"value":558},"pr_numbe",{"type":46,"tag":428,"props":560,"children":561},{"style":462},[562],{"type":52,"value":465},{"type":46,"tag":428,"props":564,"children":565},{"style":451},[566],{"type":52,"value":470},{"type":46,"tag":428,"props":568,"children":569},{"style":440},[570],{"type":52,"value":571},"\u002Fhead\n",{"type":46,"tag":428,"props":573,"children":575},{"class":430,"line":574},3,[576,580,585,590,594,599,603,607],{"type":46,"tag":428,"props":577,"children":578},{"style":435},[579],{"type":52,"value":324},{"type":46,"tag":428,"props":581,"children":582},{"style":440},[583],{"type":52,"value":584}," diff",{"type":46,"tag":428,"props":586,"children":587},{"style":440},[588],{"type":52,"value":589}," origin\u002FHEAD...",{"type":46,"tag":428,"props":591,"children":592},{"style":451},[593],{"type":52,"value":454},{"type":46,"tag":428,"props":595,"children":596},{"style":440},[597],{"type":52,"value":598},"head_sh",{"type":46,"tag":428,"props":600,"children":601},{"style":462},[602],{"type":52,"value":150},{"type":46,"tag":428,"props":604,"children":605},{"style":451},[606],{"type":52,"value":470},{"type":46,"tag":428,"props":608,"children":610},{"style":609},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[611],{"type":52,"value":612},"       # three-dot: change relative to the PR's base\n",{"type":46,"tag":55,"props":614,"children":615},{},[616,618,624,626,631],{"type":52,"value":617},"The three-dot diff (",{"type":46,"tag":155,"props":619,"children":621},{"className":620},[],[622],{"type":52,"value":623},"base...head",{"type":52,"value":625},") shows exactly what the PR introduces. Read the changed files you need to understand the change and its risk. Stay in this clone through both phases — in implement you edit, commit, and push here. Full PR mechanics (clone, three-dot diff, commit\u002Fpush to the branch): ",{"type":46,"tag":150,"props":627,"children":629},{"href":628},"references\u002Fpr-wiring.md",[630],{"type":52,"value":628},{"type":52,"value":632},".",{"type":46,"tag":298,"props":634,"children":636},{"id":635},"plan-phase",[637],{"type":52,"value":638},"Plan Phase",{"type":46,"tag":55,"props":640,"children":641},{},[642],{"type":46,"tag":61,"props":643,"children":644},{},[645],{"type":52,"value":646},"Create nothing in this phase.",{"type":46,"tag":648,"props":649,"children":650},"ol",{},[651,671,688,720,762],{"type":46,"tag":309,"props":652,"children":653},{},[654,659,661,669],{"type":46,"tag":61,"props":655,"children":656},{},[657],{"type":52,"value":658},"Confirm it should be flagged.",{"type":52,"value":660}," If ",{"type":46,"tag":150,"props":662,"children":663},{"href":152},[664],{"type":46,"tag":155,"props":665,"children":667},{"className":666},[],[668],{"type":52,"value":160},{"type":52,"value":670}," already ran, act on its verdict. Otherwise apply the same judgment: favor a flag for user-facing or risky changes; skip config-only, dependency-bump, infra, test-only, or docs changes. If a flag clearly isn't warranted, say so and stop.",{"type":46,"tag":309,"props":672,"children":673},{},[674,679,681,686],{"type":46,"tag":61,"props":675,"children":676},{},[677],{"type":52,"value":678},"Understand the change and conventions.",{"type":52,"value":680}," Read the three-dot diff and changed files — what does it do, what's the blast radius? Then follow ",{"type":46,"tag":61,"props":682,"children":683},{},[684],{"type":52,"value":685},"flag-create's Step 1",{"type":52,"value":687}," to learn how this codebase already uses flags (SDK, wrapper, key constants, naming). Don't reinvent that exploration here.",{"type":46,"tag":309,"props":689,"children":690},{},[691,696,698,704,706,711,713,718],{"type":46,"tag":61,"props":692,"children":693},{},[694],{"type":52,"value":695},"Design the flag.",{"type":52,"value":697}," Usually a single boolean kill-switch around the new path (flag-create's ",{"type":46,"tag":150,"props":699,"children":701},{"href":700},"..\u002Flaunchdarkly-flag-create\u002Freferences\u002Fflag-types.md",[702],{"type":52,"value":703},"flag-types",{"type":52,"value":705}," covers the choice). Don't propose more flags than the change needs. If Step 1 (or ",{"type":46,"tag":155,"props":707,"children":709},{"className":708},[],[710],{"type":52,"value":160},{"type":52,"value":712},") surfaced a ",{"type":46,"tag":61,"props":714,"children":715},{},[716],{"type":52,"value":717},"dependency on a parent flag\u002Ffeature that isn't live yet",{"type":52,"value":719},", note it — the release step can couple them with a prerequisite.",{"type":46,"tag":309,"props":721,"children":722},{},[723,728,730,738,740,745,747,752,754,760],{"type":46,"tag":61,"props":724,"children":725},{},[726],{"type":52,"value":727},"Plan the release.",{"type":52,"value":729}," Follow ",{"type":46,"tag":150,"props":731,"children":732},{"href":207},[733],{"type":46,"tag":155,"props":734,"children":736},{"className":735},[],[737],{"type":52,"value":214},{"type":52,"value":739},"'s plan phase: pick target environments, preview each with ",{"type":46,"tag":155,"props":741,"children":743},{"className":742},[],[744],{"type":52,"value":395},{"type":52,"value":746},", and capture the human's ",{"type":46,"tag":61,"props":748,"children":749},{},[750],{"type":52,"value":751},"release intent",{"type":52,"value":753}," (release on merge \u002F hold \u002F ",{"type":46,"tag":155,"props":755,"children":757},{"className":756},[],[758],{"type":52,"value":759},"notBefore",{"type":52,"value":761}," \u002F segment \u002F prerequisite). Don't re-derive the rollout model here — that's flag-release's job.",{"type":46,"tag":309,"props":763,"children":764},{},[765,770,772,778,780,786,788,793,795,800],{"type":46,"tag":61,"props":766,"children":767},{},[768],{"type":52,"value":769},"Present the combined plan and stop.",{"type":52,"value":771}," Summarize: the flag (",{"type":46,"tag":155,"props":773,"children":775},{"className":774},[],[776],{"type":52,"value":777},"key",{"type":52,"value":779},", ",{"type":46,"tag":155,"props":781,"children":783},{"className":782},[],[784],{"type":52,"value":785},"name",{"type":52,"value":787},", boolean, tags) and why it gates ",{"type":46,"tag":79,"props":789,"children":790},{},[791],{"type":52,"value":792},"this",{"type":52,"value":794}," change; where in the code the guard goes; the per-environment release plan + captured intent (and anything to be ",{"type":46,"tag":79,"props":796,"children":797},{},[798],{"type":52,"value":799},"held",{"type":52,"value":801},"). Then wait. Revise on feedback; proceed only on clear approval. Ask a focused question if you're genuinely missing something (project key, environments, a missing policy) rather than guessing.",{"type":46,"tag":298,"props":803,"children":805},{"id":804},"implement-phase",[806],{"type":52,"value":807},"Implement Phase",{"type":46,"tag":55,"props":809,"children":810},{},[811],{"type":52,"value":812},"Only after approval:",{"type":46,"tag":648,"props":814,"children":815},{},[816,857,867,882,909],{"type":46,"tag":309,"props":817,"children":818},{},[819,824,826,834,836,841,843,848,850,855],{"type":46,"tag":61,"props":820,"children":821},{},[822],{"type":52,"value":823},"Create the flag and wire the code",{"type":52,"value":825}," using ",{"type":46,"tag":150,"props":827,"children":828},{"href":181},[829],{"type":46,"tag":155,"props":830,"children":832},{"className":831},[],[833],{"type":52,"value":188},{"type":52,"value":835}," (its Steps 3–4): flag created OFF with the agreed key\u002Ftags, guarding evaluation added with a safe default matching the codebase's pattern. ",{"type":46,"tag":61,"props":837,"children":838},{},[839],{"type":52,"value":840},"Fail closed on creation errors:",{"type":52,"value":842}," only an \"already exists\" result is success-via-reuse. Any ",{"type":46,"tag":79,"props":844,"children":845},{},[846],{"type":52,"value":847},"other",{"type":52,"value":849}," create-flag failure (auth, permissions, not-found, server error) is a hard stop — do ",{"type":46,"tag":61,"props":851,"children":852},{},[853],{"type":52,"value":854},"not",{"type":52,"value":856}," wire the code, record the release, or report success. A false \"flag created\" yields a green PR referencing a flag that doesn't exist, worse than an honest failure. Surface the error and stop.",{"type":46,"tag":309,"props":858,"children":859},{},[860,865],{"type":46,"tag":61,"props":861,"children":862},{},[863],{"type":52,"value":864},"Add paired flag-on \u002F flag-off tests.",{"type":52,"value":866}," If the repo has a test suite, add a test for each state of the wrapped path — flag ON serves the new behavior, flag OFF preserves the old — matching the repo's framework and flag-mocking convention. Run them and continue only once green. Scope the tests to the flagged path, not general coverage. If the repo has no tests, skip and say so.",{"type":46,"tag":309,"props":868,"children":869},{},[870,875,877,881],{"type":46,"tag":61,"props":871,"children":872},{},[873],{"type":52,"value":874},"Commit and push to the PR branch.",{"type":52,"value":876}," Commit the wiring and push to the PR's existing branch so it lands in the same PR — don't open a new PR or touch the base branch. See ",{"type":46,"tag":150,"props":878,"children":879},{"href":628},[880],{"type":52,"value":628},{"type":52,"value":632},{"type":46,"tag":309,"props":883,"children":884},{},[885,889,891,899,901,907],{"type":46,"tag":61,"props":886,"children":887},{},[888],{"type":52,"value":201},{"type":52,"value":890}," by handing off to ",{"type":46,"tag":150,"props":892,"children":893},{"href":207},[894],{"type":46,"tag":155,"props":895,"children":897},{"className":896},[],[898],{"type":52,"value":214},{"type":52,"value":900},"'s implement phase: it records the automated rollout, honoring the captured intent (holding any environment the intent doesn't clear) and returns a ",{"type":46,"tag":155,"props":902,"children":904},{"className":903},[],[905],{"type":52,"value":906},"config_id",{"type":52,"value":908},". Don't re-teach the rollout mechanics here.",{"type":46,"tag":309,"props":910,"children":911},{},[912,917,919,924,926,930],{"type":46,"tag":61,"props":913,"children":914},{},[915],{"type":52,"value":916},"Report",{"type":52,"value":918}," the whole change: flag key + LaunchDarkly link (created OFF); the file(s)\u002Fcode path wired; the tests added; the per-environment release plan + ",{"type":46,"tag":155,"props":920,"children":922},{"className":921},[],[923],{"type":52,"value":906},{"type":52,"value":925},"; what was ",{"type":46,"tag":61,"props":927,"children":928},{},[929],{"type":52,"value":799},{"type":52,"value":931}," (and why) versus what releases on merge. Report only what you verified.",{"type":46,"tag":298,"props":933,"children":935},{"id":934},"edge-cases",[936],{"type":52,"value":937},"Edge Cases",{"type":46,"tag":99,"props":939,"children":940},{},[941,957],{"type":46,"tag":103,"props":942,"children":943},{},[944],{"type":46,"tag":107,"props":945,"children":946},{},[947,952],{"type":46,"tag":111,"props":948,"children":949},{},[950],{"type":52,"value":951},"Situation",{"type":46,"tag":111,"props":953,"children":954},{},[955],{"type":52,"value":956},"Action",{"type":46,"tag":127,"props":958,"children":959},{},[960,973,986,999,1020,1038],{"type":46,"tag":107,"props":961,"children":962},{},[963,968],{"type":46,"tag":134,"props":964,"children":965},{},[966],{"type":52,"value":967},"Change isn't flag-worthy",{"type":46,"tag":134,"props":969,"children":970},{},[971],{"type":52,"value":972},"Explain why (config-only, dep bump, infra, test-only, docs) and stop. Don't create a flag.",{"type":46,"tag":107,"props":974,"children":975},{},[976,981],{"type":46,"tag":134,"props":977,"children":978},{},[979],{"type":52,"value":980},"Flag already exists",{"type":46,"tag":134,"props":982,"children":983},{},[984],{"type":52,"value":985},"Reuse it — \"already exists\" is success. Wire the existing key; don't duplicate.",{"type":46,"tag":107,"props":987,"children":988},{},[989,994],{"type":46,"tag":134,"props":990,"children":991},{},[992],{"type":52,"value":993},"Flag creation fails for any other reason (auth, permissions, 5xx)",{"type":46,"tag":134,"props":995,"children":996},{},[997],{"type":52,"value":998},"Hard stop. Don't wire code, record a release, or claim success — surface the error.",{"type":46,"tag":107,"props":1000,"children":1001},{},[1002,1007],{"type":46,"tag":134,"props":1003,"children":1004},{},[1005],{"type":52,"value":1006},"Codebase has no LaunchDarkly SDK",{"type":46,"tag":134,"props":1008,"children":1009},{},[1010,1012,1018],{"type":52,"value":1011},"Wiring can't evaluate a flag — SDK install is separate (",{"type":46,"tag":150,"props":1013,"children":1015},{"href":1014},"..\u002F..\u002Fonboarding\u002Fsdk-install\u002FSKILL.md",[1016],{"type":52,"value":1017},"onboarding\u002Fsdk-install",{"type":52,"value":1019},").",{"type":46,"tag":107,"props":1021,"children":1022},{},[1023,1028],{"type":46,"tag":134,"props":1024,"children":1025},{},[1026],{"type":52,"value":1027},"Guarding needs more than a boolean",{"type":46,"tag":134,"props":1029,"children":1030},{},[1031,1033,1037],{"type":52,"value":1032},"Prefer a boolean kill-switch. Only go multivariate if the change serves distinct variants; see flag-create's ",{"type":46,"tag":150,"props":1034,"children":1035},{"href":700},[1036],{"type":52,"value":703},{"type":52,"value":632},{"type":46,"tag":107,"props":1039,"children":1040},{},[1041,1053],{"type":46,"tag":134,"props":1042,"children":1043},{},[1044,1046,1051],{"type":52,"value":1045},"Release-specific cases (hold\u002F",{"type":46,"tag":155,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":52,"value":759},{"type":52,"value":1052},", prerequisites, no matching policy, duplicate config, no useful metric)",{"type":46,"tag":134,"props":1054,"children":1055},{},[1056,1058,1066],{"type":52,"value":1057},"Handled by ",{"type":46,"tag":150,"props":1059,"children":1060},{"href":207},[1061],{"type":46,"tag":155,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":52,"value":214},{"type":52,"value":1067}," — see its edge cases.",{"type":46,"tag":298,"props":1069,"children":1071},{"id":1070},"what-not-to-do",[1072],{"type":52,"value":1073},"What NOT to Do",{"type":46,"tag":305,"props":1075,"children":1076},{},[1077,1087,1117,1127,1137],{"type":46,"tag":309,"props":1078,"children":1079},{},[1080,1085],{"type":46,"tag":61,"props":1081,"children":1082},{},[1083],{"type":52,"value":1084},"Don't create anything in the plan phase.",{"type":52,"value":1086}," Plan proposes; implement creates.",{"type":46,"tag":309,"props":1088,"children":1089},{},[1090,1095,1097,1105,1107,1115],{"type":46,"tag":61,"props":1091,"children":1092},{},[1093],{"type":52,"value":1094},"Don't re-document flag creation, SDK guarding, or rollout mechanics here",{"type":52,"value":1096}," — those are ",{"type":46,"tag":150,"props":1098,"children":1099},{"href":181},[1100],{"type":46,"tag":155,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":52,"value":188},{"type":52,"value":1106}," and ",{"type":46,"tag":150,"props":1108,"children":1109},{"href":207},[1110],{"type":46,"tag":155,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":52,"value":214},{"type":52,"value":1116},". Link to them.",{"type":46,"tag":309,"props":1118,"children":1119},{},[1120,1125],{"type":46,"tag":61,"props":1121,"children":1122},{},[1123],{"type":52,"value":1124},"Don't turn the flag on yourself.",{"type":52,"value":1126}," The recorded release owns that; creating the flag OFF is the point.",{"type":46,"tag":309,"props":1128,"children":1129},{},[1130,1135],{"type":46,"tag":61,"props":1131,"children":1132},{},[1133],{"type":52,"value":1134},"Don't over-flag.",{"type":52,"value":1136}," One kill-switch beats several speculative flags.",{"type":46,"tag":309,"props":1138,"children":1139},{},[1140,1145],{"type":46,"tag":61,"props":1141,"children":1142},{},[1143],{"type":52,"value":1144},"Don't handle or print credentials.",{"type":52,"value":1146}," Git access is injected.",{"type":46,"tag":298,"props":1148,"children":1150},{"id":1149},"references",[1151],{"type":52,"value":1152},"References",{"type":46,"tag":305,"props":1154,"children":1155},{},[1156,1170,1183,1196],{"type":46,"tag":309,"props":1157,"children":1158},{},[1159,1163,1165],{"type":46,"tag":150,"props":1160,"children":1161},{"href":628},[1162],{"type":52,"value":628},{"type":52,"value":1164},": PR mechanics — clone, three-dot diff, committing to the PR branch. ",{"type":46,"tag":79,"props":1166,"children":1167},{},[1168],{"type":52,"value":1169},"(This skill's only unique reference.)",{"type":46,"tag":309,"props":1171,"children":1172},{},[1173,1181],{"type":46,"tag":150,"props":1174,"children":1175},{"href":152},[1176],{"type":46,"tag":155,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":52,"value":160},{"type":52,"value":1182},": the flag-worthiness decision.",{"type":46,"tag":309,"props":1184,"children":1185},{},[1186,1194],{"type":46,"tag":150,"props":1187,"children":1188},{"href":181},[1189],{"type":46,"tag":155,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":52,"value":188},{"type":52,"value":1195},": flag creation + per-SDK guarding patterns.",{"type":46,"tag":309,"props":1197,"children":1198},{},[1199,1207,1209,1215],{"type":46,"tag":150,"props":1200,"children":1201},{"href":207},[1202],{"type":46,"tag":155,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":52,"value":214},{"type":52,"value":1208},": recording the automated rollout (and its ",{"type":46,"tag":150,"props":1210,"children":1212},{"href":1211},"..\u002Fflag-release\u002Freferences\u002Fauto-release.md",[1213],{"type":52,"value":1214},"auto-release.md",{"type":52,"value":1216}," release model).",{"type":46,"tag":1218,"props":1219,"children":1220},"style",{},[1221],{"type":52,"value":1222},"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":1224,"total":1308},[1225,1242,1251,1265,1276,1286,1294],{"slug":1226,"name":1226,"fn":1227,"description":1228,"org":1229,"tags":1230,"stars":23,"repoUrl":24,"updatedAt":1241},"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},[1231,1234,1237,1238],{"name":1232,"slug":1233,"type":15},"Agents","agents",{"name":1235,"slug":1236,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":1239,"slug":1240,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1243,"name":1243,"fn":1244,"description":1245,"org":1246,"tags":1247,"stars":23,"repoUrl":24,"updatedAt":1250},"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},[1248,1249],{"name":1232,"slug":1233,"type":15},{"name":1235,"slug":1236,"type":15},"2026-05-22T06:55:56.527064",{"slug":1252,"name":1252,"fn":1253,"description":1254,"org":1255,"tags":1256,"stars":23,"repoUrl":24,"updatedAt":1264},"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},[1257,1260,1261],{"name":1258,"slug":1259,"type":15},"Analytics","analytics",{"name":9,"slug":8,"type":15},{"name":1262,"slug":1263,"type":15},"Metrics","metrics","2026-05-22T06:55:53.858749",{"slug":1266,"name":1266,"fn":1267,"description":1268,"org":1269,"tags":1270,"stars":23,"repoUrl":24,"updatedAt":1275},"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},[1271,1272],{"name":9,"slug":8,"type":15},{"name":1273,"slug":1274,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1277,"name":1277,"fn":1278,"description":1279,"org":1280,"tags":1281,"stars":23,"repoUrl":24,"updatedAt":1285},"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},[1282,1283,1284],{"name":1258,"slug":1259,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1287,"name":1287,"fn":1288,"description":1289,"org":1290,"tags":1291,"stars":23,"repoUrl":24,"updatedAt":1293},"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},[1292],{"name":1273,"slug":1274,"type":15},"2026-05-22T06:55:44.464733",{"slug":1295,"name":1295,"fn":1296,"description":1297,"org":1298,"tags":1299,"stars":23,"repoUrl":24,"updatedAt":1307},"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},[1300,1303,1304],{"name":1301,"slug":1302,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1305,"slug":1306,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",49,{"items":1310,"total":1308},[1311,1318,1323,1329,1334,1340,1344,1350,1361,1370,1380,1389],{"slug":1226,"name":1226,"fn":1227,"description":1228,"org":1312,"tags":1313,"stars":23,"repoUrl":24,"updatedAt":1241},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1314,1315,1316,1317],{"name":1232,"slug":1233,"type":15},{"name":1235,"slug":1236,"type":15},{"name":9,"slug":8,"type":15},{"name":1239,"slug":1240,"type":15},{"slug":1243,"name":1243,"fn":1244,"description":1245,"org":1319,"tags":1320,"stars":23,"repoUrl":24,"updatedAt":1250},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1321,1322],{"name":1232,"slug":1233,"type":15},{"name":1235,"slug":1236,"type":15},{"slug":1252,"name":1252,"fn":1253,"description":1254,"org":1324,"tags":1325,"stars":23,"repoUrl":24,"updatedAt":1264},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1326,1327,1328],{"name":1258,"slug":1259,"type":15},{"name":9,"slug":8,"type":15},{"name":1262,"slug":1263,"type":15},{"slug":1266,"name":1266,"fn":1267,"description":1268,"org":1330,"tags":1331,"stars":23,"repoUrl":24,"updatedAt":1275},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1332,1333],{"name":9,"slug":8,"type":15},{"name":1273,"slug":1274,"type":15},{"slug":1277,"name":1277,"fn":1278,"description":1279,"org":1335,"tags":1336,"stars":23,"repoUrl":24,"updatedAt":1285},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1337,1338,1339],{"name":1258,"slug":1259,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":1287,"name":1287,"fn":1288,"description":1289,"org":1341,"tags":1342,"stars":23,"repoUrl":24,"updatedAt":1293},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1343],{"name":1273,"slug":1274,"type":15},{"slug":1295,"name":1295,"fn":1296,"description":1297,"org":1345,"tags":1346,"stars":23,"repoUrl":24,"updatedAt":1307},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1347,1348,1349],{"name":1301,"slug":1302,"type":15},{"name":9,"slug":8,"type":15},{"name":1305,"slug":1306,"type":15},{"slug":1351,"name":1351,"fn":1352,"description":1353,"org":1354,"tags":1355,"stars":23,"repoUrl":24,"updatedAt":1360},"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},[1356,1359],{"name":1357,"slug":1358,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1362,"name":1362,"fn":1363,"description":1364,"org":1365,"tags":1366,"stars":23,"repoUrl":24,"updatedAt":1369},"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},[1367,1368],{"name":1357,"slug":1358,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1371,"name":1371,"fn":1372,"description":1373,"org":1374,"tags":1375,"stars":23,"repoUrl":24,"updatedAt":1379},"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},[1376,1377,1378],{"name":1357,"slug":1358,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1381,"name":1381,"fn":1382,"description":1383,"org":1384,"tags":1385,"stars":23,"repoUrl":24,"updatedAt":1388},"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},[1386,1387],{"name":9,"slug":8,"type":15},{"name":1273,"slug":1274,"type":15},"2026-05-22T06:55:39.13373",{"slug":1390,"name":1390,"fn":1391,"description":1392,"org":1393,"tags":1394,"stars":23,"repoUrl":24,"updatedAt":1397},"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},[1395,1396],{"name":9,"slug":8,"type":15},{"name":1273,"slug":1274,"type":15},"2026-05-22T06:55:40.464884"]