[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-flag-release":3,"mdc--64ddl-key":37,"related-org-launchdarkly-flag-release":1712,"related-repo-launchdarkly-flag-release":1846},{"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-release","automate LaunchDarkly feature flag rollouts","Record an automated rollout for an existing LaunchDarkly flag that guards a pull request's change, so the change releases safely when the PR merges. Honors a stated release intent (release now \u002F hold \u002F notBefore \u002F segment \u002F prerequisite) and defers per-environment to the project's release policies. Use as the release step once the guarding flag exists and its code is wired. Keywords: record release, automated rollout, release policy, guarded rollout, staged rollout, simple vs policy, release intent, hold release, dark launch.",{"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:54.462665","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-release","---\nname: flag-release\ndescription: \"Record an automated rollout for an existing LaunchDarkly flag that guards a pull request's change, so the change releases safely when the PR merges. Honors a stated release intent (release now \u002F hold \u002F notBefore \u002F segment \u002F prerequisite) and defers per-environment to the project's release policies. Use as the release step once the guarding flag exists and its code is wired. Keywords: record release, automated rollout, release policy, guarded rollout, staged rollout, simple vs policy, release intent, hold release, dark launch.\"\nlicense: Apache-2.0\ncompatibility: Requires the remotely hosted LaunchDarkly MCP server. Operates on a flag that already exists; does not create flags or edit code.\nmetadata:\n  author: launchdarkly\n  version: \"0.1.0\"\n---\n\n# Record a Flag's Automated Release\n\nYou're using a skill that takes an **existing** feature flag (created OFF) that guards a pull request's change, and records an **automated rollout** so the change releases safely once the PR merges — no human toggling a flag. It defers per-environment to the team's release policies and honors any human-stated release intent.\n\nThis is the **release step** of the PR flag workflow, and it's deliberately atomic:\n\n| Step | Owned by |\n|------|----------|\n| Decide *whether* to flag | [`should-flag-change`](..\u002Fshould-flag-change\u002FSKILL.md) (advisory) |\n| Create the flag + wire the code | [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md) |\n| **Record the release** | **this skill** |\n\nBy the time this skill runs, the flag exists (OFF) and the guarding code is wired and pushed. This skill only records the rollout — it never creates flags or edits code. It can be driven directly by an automation harness, or as the final step of the [`flag-and-release-change`](..\u002Fflag-and-release-change\u002FSKILL.md) orchestrator.\n\n**The deploy is not the release.** The merge ships the control path (flag OFF); the *release* is the flag operation this rollout performs afterward, governed by the environment's policy.\n\n> **Honoring a hold is the one thing you must get right.** There is no \"hold\" release type, and **`policy` is NOT a manual gate.** On merge, `policy` *automatically* performs the environment's release (immediate, progressive, or guarded) with **no human promotion step** — a guarded rollout still *starts on its own* the moment the PR merges. So recording a held environment as `policy` does **not** hold it; it releases it on merge, before any `notBefore` date. The only way to hold an environment is to **omit it from the `environments` array entirely**, which leaves the flag OFF there. If the user wants an environment held (or not released until a date), exclude it from the call and report it as held. When in doubt, omit.\n\n## Prerequisites\n\n- The remotely hosted LaunchDarkly MCP server.\n- The guarding flag already exists in LaunchDarkly, created OFF, with the agreed key\u002Ftags.\n- A pull-request reference (`repoFullName` + `prNumber`, or `prUrl`) so the rollout binds to the right merge.\n\n**MCP tools this skill uses:**\n- `create-automated-rollout-config` — record the rollout for the flag against the PR *(the deliverable)*\n- `match-release-policies` — resolve which release policy governs each environment (call before proposing the plan)\n- `list-release-policies` — see the project's release policies and the metrics they auto-attach\n- `get-flag` — confirm the flag exists and is OFF before recording\n\nFull release model — `simple` vs `policy`, precedence, previewing, prerequisites, metric adequacy: [references\u002Fauto-release.md](references\u002Fauto-release.md).\n\n## Plan Phase\n\n**Record nothing in this phase.**\n\n1. **Confirm the flag.** `get-flag` to verify the guarding flag exists and is OFF. If it doesn't exist yet, stop — creation is [`launchdarkly-flag-create`](..\u002Flaunchdarkly-flag-create\u002FSKILL.md)'s job, and recording a rollout for a missing flag fails confusingly.\n2. **Pick the target environments.** Use the environments named by the user or harness. Don't hardcode a set — a given change can't always release to every environment. If none are named, enumerate the project's real keys and confirm the set rather than assuming.\n3. **Preview each environment's policy.** Call `match-release-policies` (by `flagKey` + `environmentKey`) to resolve, deterministically, what a `policy` release will do per environment — `winningReleaseMethod` (immediate \u002F progressive \u002F guarded \u002F none). Don't reason about policy scope by hand. For a **guarded** winner, check the auto-attached metrics can actually compare this change (see the metric-adequacy note in [references\u002Fauto-release.md](references\u002Fauto-release.md)).\n4. **Capture the human's release intent.** Ask (briefly, only if not already stated): release **on merge**, **hold** (recorded but not released yet), or wait until a **`notBefore`** date? A **cohort\u002Fsegment** to target first? A **prerequisite** parent flag this must not precede? Intent sits above the policy in precedence and is **honored or explicitly held — never silently dropped**.\n5. **Present the per-environment plan and stop.** For each environment, state either the `releaseType` it will be recorded with (`simple` \u002F `policy`, and what that does on merge) **or** that it will be **held** — omitted from the recorded config so the flag stays OFF there — with the reason. Wait for confirmation; revise on feedback.\n\n## Implement Phase\n\nOnly after confirmation:\n\n1. **Sort every target environment into exactly one bucket — RELEASE or HOLD.** Do this *before* you build the call. There is no third bucket, and `releaseType` does not create one.\n\n   | Bucket | Meaning | What goes in the call |\n   |--------|---------|-----------------------|\n   | **RELEASE** | Goes live on merge — now, or per its policy | Add `{ environmentKey, releaseType }` to the `environments` array |\n   | **HOLD** | Not yet — waiting on a date, sign-off, segment, or parent flag | **Nothing.** Leave it out of `environments` entirely; name it as held in your report |\n\n   `releaseType` (`simple` vs `policy`) only chooses *how* a RELEASE environment goes live — it never holds one. **Both release on merge:** `simple` serves `true` immediately; `policy` runs that environment's policy (immediate \u002F progressive \u002F guarded) automatically, with no human promotion step. \"`policy` defers to the *policy*\" — not to you, and not until a date. **Do not reach for `policy` to park a held environment: it ships that environment on merge, before any `notBefore`.** The only encoding of a hold is *absence from the array*.\n\n2. **Build `environments` from the RELEASE bucket only — then read the keys back.** The array must contain every RELEASE environment and no HOLD environment. Before you send the call, scan the `environmentKey`s in the array: if any environment you're holding appears there, delete that entry. The call has **no field for a date or a hold** — if you catch yourself wanting to add `holdUntil`, `notBefore`, or `hold` to an entry (or to keep it as `policy` \"so it waits\"), that is the signal the environment is HOLD: **drop the entry, don't invent a field.** The date and reason go in your report, not the call.\n\n   Worked example — *\"release staging on merge, hold production until 2026-09-01\"*: staging is RELEASE, production is HOLD.\n\n   ```json\n   {\n     \"projectKey\": \"default\",\n     \"flagKey\": \"new-checkout-flow\",\n     \"environments\": [{ \"environmentKey\": \"staging\", \"releaseType\": \"simple\" }],\n     \"repoFullName\": \"acme\u002Fstorefront\",\n     \"prNumber\": 482\n   }\n   ```\n\n   `production` appears nowhere in the call. You report it held until 2026-09-01, with the reason (legal sign-off). Fail closed: if an environment's intent is unclear, it's HOLD, not RELEASE.\n\n3. **Record the rollout.** Call `create-automated-rollout-config` with `projectKey`, `flagKey`, the RELEASE-only `environments` array, and the PR reference. If a **prerequisite** parent flag was agreed, wire it if the MCP surface supports it; otherwise report it as a manual step. Details: [references\u002Fauto-release.md](references\u002Fauto-release.md).\n4. **Verify.** The call returns `created`, `config_id`, and the normalized per-environment plan — record `config_id`. Report only what you verified; flag anything you couldn't confirm rather than asserting it.\n5. **Report** the per-environment release plan + `config_id`; what was **held** (and why) versus what releases on merge; and what happens on merge (e.g. \"production resolves policy X → guarded rollout on merge; staging serves true immediately; production held until 2026-08-01 per intent\").\n\n## Edge Cases\n\n| Situation | Action |\n|-----------|--------|\n| Flag doesn't exist yet | Stop — creation is `launchdarkly-flag-create`. Recording a rollout for a missing flag fails confusingly. |\n| A rollout config already exists for this flag + PR | Don't record a second one — a duplicate confuses the scheduler. Point the user at the existing config to change the plan. |\n| Registering before the PR exists | `simple` envs work without a PR, but `policy` envs need `repoFullName`\u002F`prNumber` to trigger on merge. Prefer recording *after* the PR is open; if you record early, say `policy` won't fire until the PR is wired. |\n| No release policy matches an env | `policy` falls back to defaults (often immediate). Tell the user; offer `simple`, or point at release-policy setup. |\n| User wants to hold, or set a `notBefore` date | Skip the releasing plan for those environments; report them as held with the reason. Never silently release against stated intent. |\n| Change depends on a parent flag not yet live | Couple them with a prerequisite (set it if the MCP surface supports it); otherwise report the coupling as a required manual step. Don't let this flag release before its parent. |\n| A `policy` env resolves to guarded but has no relevant metric | Say so — a guarded rollout with no meaningful metric guards nothing. Recommend `simple`, or point at metric setup. |\n\n## What NOT to Do\n\n- **Don't create the flag or edit code** — that's `launchdarkly-flag-create`. This skill only records the release.\n- **Don't turn the flag on yourself, or toggle it after recording the config.** The rollout owns that; double-toggling causes audit noise and confuses the scheduler.\n- **Don't skip `match-release-policies`.** Proposing `policy` without knowing what it resolves to is guessing.\n- **Don't silently release against a stated hold\u002F`notBefore`.** Honor intent or hold — never drop it.\n- **Don't handle or print credentials.** Access is injected by the environment.\n\n## References\n\n- [references\u002Fauto-release.md](references\u002Fauto-release.md): the automated-rollout \u002F release-policy model, `simple` vs `policy`, precedence (intent → override → policy → default), previewing, prerequisites, metric adequacy. *(Core of this skill.)*\n- [`launchdarkly-guarded-rollout`](..\u002Flaunchdarkly-guarded-rollout\u002FSKILL.md): for a *bespoke* rollout no policy expresses — set that env to `simple` here and drive the guarded rollout by hand after merge.\n",{"data":38,"body":42},{"name":4,"description":6,"license":26,"compatibility":39,"metadata":40},"Requires the remotely hosted LaunchDarkly MCP server. Operates on a flag that already exists; does not create flags or edit code.",{"author":8,"version":41},"0.1.0",{"type":43,"children":44},"root",[45,54,75,87,188,205,222,314,321,365,373,425,452,458,466,666,672,677,1357,1363,1556,1562,1641,1647,1706],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"record-a-flags-automated-release",[51],{"type":52,"value":53},"text","Record a Flag's Automated Release",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58,60,66,68,73],{"type":52,"value":59},"You're using a skill that takes an ",{"type":46,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":52,"value":65},"existing",{"type":52,"value":67}," feature flag (created OFF) that guards a pull request's change, and records an ",{"type":46,"tag":61,"props":69,"children":70},{},[71],{"type":52,"value":72},"automated rollout",{"type":52,"value":74}," so the change releases safely once the PR merges — no human toggling a flag. It defers per-environment to the team's release policies and honors any human-stated release intent.",{"type":46,"tag":55,"props":76,"children":77},{},[78,80,85],{"type":52,"value":79},"This is the ",{"type":46,"tag":61,"props":81,"children":82},{},[83],{"type":52,"value":84},"release step",{"type":52,"value":86}," of the PR flag workflow, and it's deliberately atomic:",{"type":46,"tag":88,"props":89,"children":90},"table",{},[91,110],{"type":46,"tag":92,"props":93,"children":94},"thead",{},[95],{"type":46,"tag":96,"props":97,"children":98},"tr",{},[99,105],{"type":46,"tag":100,"props":101,"children":102},"th",{},[103],{"type":52,"value":104},"Step",{"type":46,"tag":100,"props":106,"children":107},{},[108],{"type":52,"value":109},"Owned by",{"type":46,"tag":111,"props":112,"children":113},"tbody",{},[114,148,169],{"type":46,"tag":96,"props":115,"children":116},{},[117,131],{"type":46,"tag":118,"props":119,"children":120},"td",{},[121,123,129],{"type":52,"value":122},"Decide ",{"type":46,"tag":124,"props":125,"children":126},"em",{},[127],{"type":52,"value":128},"whether",{"type":52,"value":130}," to flag",{"type":46,"tag":118,"props":132,"children":133},{},[134,146],{"type":46,"tag":135,"props":136,"children":138},"a",{"href":137},"..\u002Fshould-flag-change\u002FSKILL.md",[139],{"type":46,"tag":140,"props":141,"children":143},"code",{"className":142},[],[144],{"type":52,"value":145},"should-flag-change",{"type":52,"value":147}," (advisory)",{"type":46,"tag":96,"props":149,"children":150},{},[151,156],{"type":46,"tag":118,"props":152,"children":153},{},[154],{"type":52,"value":155},"Create the flag + wire the code",{"type":46,"tag":118,"props":157,"children":158},{},[159],{"type":46,"tag":135,"props":160,"children":162},{"href":161},"..\u002Flaunchdarkly-flag-create\u002FSKILL.md",[163],{"type":46,"tag":140,"props":164,"children":166},{"className":165},[],[167],{"type":52,"value":168},"launchdarkly-flag-create",{"type":46,"tag":96,"props":170,"children":171},{},[172,180],{"type":46,"tag":118,"props":173,"children":174},{},[175],{"type":46,"tag":61,"props":176,"children":177},{},[178],{"type":52,"value":179},"Record the release",{"type":46,"tag":118,"props":181,"children":182},{},[183],{"type":46,"tag":61,"props":184,"children":185},{},[186],{"type":52,"value":187},"this skill",{"type":46,"tag":55,"props":189,"children":190},{},[191,193,203],{"type":52,"value":192},"By the time this skill runs, the flag exists (OFF) and the guarding code is wired and pushed. This skill only records the rollout — it never creates flags or edits code. It can be driven directly by an automation harness, or as the final step of the ",{"type":46,"tag":135,"props":194,"children":196},{"href":195},"..\u002Fflag-and-release-change\u002FSKILL.md",[197],{"type":46,"tag":140,"props":198,"children":200},{"className":199},[],[201],{"type":52,"value":202},"flag-and-release-change",{"type":52,"value":204}," orchestrator.",{"type":46,"tag":55,"props":206,"children":207},{},[208,213,215,220],{"type":46,"tag":61,"props":209,"children":210},{},[211],{"type":52,"value":212},"The deploy is not the release.",{"type":52,"value":214}," The merge ships the control path (flag OFF); the ",{"type":46,"tag":124,"props":216,"children":217},{},[218],{"type":52,"value":219},"release",{"type":52,"value":221}," is the flag operation this rollout performs afterward, governed by the environment's policy.",{"type":46,"tag":223,"props":224,"children":225},"blockquote",{},[226],{"type":46,"tag":55,"props":227,"children":228},{},[229,234,236,247,249,254,256,261,263,268,270,275,277,282,284,289,291,297,299,312],{"type":46,"tag":61,"props":230,"children":231},{},[232],{"type":52,"value":233},"Honoring a hold is the one thing you must get right.",{"type":52,"value":235}," There is no \"hold\" release type, and ",{"type":46,"tag":61,"props":237,"children":238},{},[239,245],{"type":46,"tag":140,"props":240,"children":242},{"className":241},[],[243],{"type":52,"value":244},"policy",{"type":52,"value":246}," is NOT a manual gate.",{"type":52,"value":248}," On merge, ",{"type":46,"tag":140,"props":250,"children":252},{"className":251},[],[253],{"type":52,"value":244},{"type":52,"value":255}," ",{"type":46,"tag":124,"props":257,"children":258},{},[259],{"type":52,"value":260},"automatically",{"type":52,"value":262}," performs the environment's release (immediate, progressive, or guarded) with ",{"type":46,"tag":61,"props":264,"children":265},{},[266],{"type":52,"value":267},"no human promotion step",{"type":52,"value":269}," — a guarded rollout still ",{"type":46,"tag":124,"props":271,"children":272},{},[273],{"type":52,"value":274},"starts on its own",{"type":52,"value":276}," the moment the PR merges. So recording a held environment as ",{"type":46,"tag":140,"props":278,"children":280},{"className":279},[],[281],{"type":52,"value":244},{"type":52,"value":283}," does ",{"type":46,"tag":61,"props":285,"children":286},{},[287],{"type":52,"value":288},"not",{"type":52,"value":290}," hold it; it releases it on merge, before any ",{"type":46,"tag":140,"props":292,"children":294},{"className":293},[],[295],{"type":52,"value":296},"notBefore",{"type":52,"value":298}," date. The only way to hold an environment is to ",{"type":46,"tag":61,"props":300,"children":301},{},[302,304,310],{"type":52,"value":303},"omit it from the ",{"type":46,"tag":140,"props":305,"children":307},{"className":306},[],[308],{"type":52,"value":309},"environments",{"type":52,"value":311}," array entirely",{"type":52,"value":313},", which leaves the flag OFF there. If the user wants an environment held (or not released until a date), exclude it from the call and report it as held. When in doubt, omit.",{"type":46,"tag":315,"props":316,"children":318},"h2",{"id":317},"prerequisites",[319],{"type":52,"value":320},"Prerequisites",{"type":46,"tag":322,"props":323,"children":324},"ul",{},[325,331,336],{"type":46,"tag":326,"props":327,"children":328},"li",{},[329],{"type":52,"value":330},"The remotely hosted LaunchDarkly MCP server.",{"type":46,"tag":326,"props":332,"children":333},{},[334],{"type":52,"value":335},"The guarding flag already exists in LaunchDarkly, created OFF, with the agreed key\u002Ftags.",{"type":46,"tag":326,"props":337,"children":338},{},[339,341,347,349,355,357,363],{"type":52,"value":340},"A pull-request reference (",{"type":46,"tag":140,"props":342,"children":344},{"className":343},[],[345],{"type":52,"value":346},"repoFullName",{"type":52,"value":348}," + ",{"type":46,"tag":140,"props":350,"children":352},{"className":351},[],[353],{"type":52,"value":354},"prNumber",{"type":52,"value":356},", or ",{"type":46,"tag":140,"props":358,"children":360},{"className":359},[],[361],{"type":52,"value":362},"prUrl",{"type":52,"value":364},") so the rollout binds to the right merge.",{"type":46,"tag":55,"props":366,"children":367},{},[368],{"type":46,"tag":61,"props":369,"children":370},{},[371],{"type":52,"value":372},"MCP tools this skill uses:",{"type":46,"tag":322,"props":374,"children":375},{},[376,392,403,414],{"type":46,"tag":326,"props":377,"children":378},{},[379,385,387],{"type":46,"tag":140,"props":380,"children":382},{"className":381},[],[383],{"type":52,"value":384},"create-automated-rollout-config",{"type":52,"value":386}," — record the rollout for the flag against the PR ",{"type":46,"tag":124,"props":388,"children":389},{},[390],{"type":52,"value":391},"(the deliverable)",{"type":46,"tag":326,"props":393,"children":394},{},[395,401],{"type":46,"tag":140,"props":396,"children":398},{"className":397},[],[399],{"type":52,"value":400},"match-release-policies",{"type":52,"value":402}," — resolve which release policy governs each environment (call before proposing the plan)",{"type":46,"tag":326,"props":404,"children":405},{},[406,412],{"type":46,"tag":140,"props":407,"children":409},{"className":408},[],[410],{"type":52,"value":411},"list-release-policies",{"type":52,"value":413}," — see the project's release policies and the metrics they auto-attach",{"type":46,"tag":326,"props":415,"children":416},{},[417,423],{"type":46,"tag":140,"props":418,"children":420},{"className":419},[],[421],{"type":52,"value":422},"get-flag",{"type":52,"value":424}," — confirm the flag exists and is OFF before recording",{"type":46,"tag":55,"props":426,"children":427},{},[428,430,436,438,443,445,450],{"type":52,"value":429},"Full release model — ",{"type":46,"tag":140,"props":431,"children":433},{"className":432},[],[434],{"type":52,"value":435},"simple",{"type":52,"value":437}," vs ",{"type":46,"tag":140,"props":439,"children":441},{"className":440},[],[442],{"type":52,"value":244},{"type":52,"value":444},", precedence, previewing, prerequisites, metric adequacy: ",{"type":46,"tag":135,"props":446,"children":448},{"href":447},"references\u002Fauto-release.md",[449],{"type":52,"value":447},{"type":52,"value":451},".",{"type":46,"tag":315,"props":453,"children":455},{"id":454},"plan-phase",[456],{"type":52,"value":457},"Plan Phase",{"type":46,"tag":55,"props":459,"children":460},{},[461],{"type":46,"tag":61,"props":462,"children":463},{},[464],{"type":52,"value":465},"Record nothing in this phase.",{"type":46,"tag":467,"props":468,"children":469},"ol",{},[470,496,506,566,620],{"type":46,"tag":326,"props":471,"children":472},{},[473,478,479,484,486,494],{"type":46,"tag":61,"props":474,"children":475},{},[476],{"type":52,"value":477},"Confirm the flag.",{"type":52,"value":255},{"type":46,"tag":140,"props":480,"children":482},{"className":481},[],[483],{"type":52,"value":422},{"type":52,"value":485}," to verify the guarding flag exists and is OFF. If it doesn't exist yet, stop — creation is ",{"type":46,"tag":135,"props":487,"children":488},{"href":161},[489],{"type":46,"tag":140,"props":490,"children":492},{"className":491},[],[493],{"type":52,"value":168},{"type":52,"value":495},"'s job, and recording a rollout for a missing flag fails confusingly.",{"type":46,"tag":326,"props":497,"children":498},{},[499,504],{"type":46,"tag":61,"props":500,"children":501},{},[502],{"type":52,"value":503},"Pick the target environments.",{"type":52,"value":505}," Use the environments named by the user or harness. Don't hardcode a set — a given change can't always release to every environment. If none are named, enumerate the project's real keys and confirm the set rather than assuming.",{"type":46,"tag":326,"props":507,"children":508},{},[509,514,516,521,523,529,530,536,538,543,545,551,553,558,560,564],{"type":46,"tag":61,"props":510,"children":511},{},[512],{"type":52,"value":513},"Preview each environment's policy.",{"type":52,"value":515}," Call ",{"type":46,"tag":140,"props":517,"children":519},{"className":518},[],[520],{"type":52,"value":400},{"type":52,"value":522}," (by ",{"type":46,"tag":140,"props":524,"children":526},{"className":525},[],[527],{"type":52,"value":528},"flagKey",{"type":52,"value":348},{"type":46,"tag":140,"props":531,"children":533},{"className":532},[],[534],{"type":52,"value":535},"environmentKey",{"type":52,"value":537},") to resolve, deterministically, what a ",{"type":46,"tag":140,"props":539,"children":541},{"className":540},[],[542],{"type":52,"value":244},{"type":52,"value":544}," release will do per environment — ",{"type":46,"tag":140,"props":546,"children":548},{"className":547},[],[549],{"type":52,"value":550},"winningReleaseMethod",{"type":52,"value":552}," (immediate \u002F progressive \u002F guarded \u002F none). Don't reason about policy scope by hand. For a ",{"type":46,"tag":61,"props":554,"children":555},{},[556],{"type":52,"value":557},"guarded",{"type":52,"value":559}," winner, check the auto-attached metrics can actually compare this change (see the metric-adequacy note in ",{"type":46,"tag":135,"props":561,"children":562},{"href":447},[563],{"type":52,"value":447},{"type":52,"value":565},").",{"type":46,"tag":326,"props":567,"children":568},{},[569,574,576,581,583,588,590,598,600,605,607,612,614,619],{"type":46,"tag":61,"props":570,"children":571},{},[572],{"type":52,"value":573},"Capture the human's release intent.",{"type":52,"value":575}," Ask (briefly, only if not already stated): release ",{"type":46,"tag":61,"props":577,"children":578},{},[579],{"type":52,"value":580},"on merge",{"type":52,"value":582},", ",{"type":46,"tag":61,"props":584,"children":585},{},[586],{"type":52,"value":587},"hold",{"type":52,"value":589}," (recorded but not released yet), or wait until a ",{"type":46,"tag":61,"props":591,"children":592},{},[593],{"type":46,"tag":140,"props":594,"children":596},{"className":595},[],[597],{"type":52,"value":296},{"type":52,"value":599}," date? A ",{"type":46,"tag":61,"props":601,"children":602},{},[603],{"type":52,"value":604},"cohort\u002Fsegment",{"type":52,"value":606}," to target first? A ",{"type":46,"tag":61,"props":608,"children":609},{},[610],{"type":52,"value":611},"prerequisite",{"type":52,"value":613}," parent flag this must not precede? Intent sits above the policy in precedence and is ",{"type":46,"tag":61,"props":615,"children":616},{},[617],{"type":52,"value":618},"honored or explicitly held — never silently dropped",{"type":52,"value":451},{"type":46,"tag":326,"props":621,"children":622},{},[623,628,630,636,638,643,645,650,652,657,659,664],{"type":46,"tag":61,"props":624,"children":625},{},[626],{"type":52,"value":627},"Present the per-environment plan and stop.",{"type":52,"value":629}," For each environment, state either the ",{"type":46,"tag":140,"props":631,"children":633},{"className":632},[],[634],{"type":52,"value":635},"releaseType",{"type":52,"value":637}," it will be recorded with (",{"type":46,"tag":140,"props":639,"children":641},{"className":640},[],[642],{"type":52,"value":435},{"type":52,"value":644}," \u002F ",{"type":46,"tag":140,"props":646,"children":648},{"className":647},[],[649],{"type":52,"value":244},{"type":52,"value":651},", and what that does on merge) ",{"type":46,"tag":61,"props":653,"children":654},{},[655],{"type":52,"value":656},"or",{"type":52,"value":658}," that it will be ",{"type":46,"tag":61,"props":660,"children":661},{},[662],{"type":52,"value":663},"held",{"type":52,"value":665}," — omitted from the recorded config so the flag stays OFF there — with the reason. Wait for confirmation; revise on feedback.",{"type":46,"tag":315,"props":667,"children":669},{"id":668},"implement-phase",[670],{"type":52,"value":671},"Implement Phase",{"type":46,"tag":55,"props":673,"children":674},{},[675],{"type":52,"value":676},"Only after confirmation:",{"type":46,"tag":467,"props":678,"children":679},{},[680,898,1255,1302,1334],{"type":46,"tag":326,"props":681,"children":682},{},[683,688,690,695,697,702,704,800,804,809,811,816,817,822,824,829,831,836,837,842,844,850,852,857,859,864,866,870,872,890,892,897],{"type":46,"tag":61,"props":684,"children":685},{},[686],{"type":52,"value":687},"Sort every target environment into exactly one bucket — RELEASE or HOLD.",{"type":52,"value":689}," Do this ",{"type":46,"tag":124,"props":691,"children":692},{},[693],{"type":52,"value":694},"before",{"type":52,"value":696}," you build the call. There is no third bucket, and ",{"type":46,"tag":140,"props":698,"children":700},{"className":699},[],[701],{"type":52,"value":635},{"type":52,"value":703}," does not create one.",{"type":46,"tag":88,"props":705,"children":706},{},[707,728],{"type":46,"tag":92,"props":708,"children":709},{},[710],{"type":46,"tag":96,"props":711,"children":712},{},[713,718,723],{"type":46,"tag":100,"props":714,"children":715},{},[716],{"type":52,"value":717},"Bucket",{"type":46,"tag":100,"props":719,"children":720},{},[721],{"type":52,"value":722},"Meaning",{"type":46,"tag":100,"props":724,"children":725},{},[726],{"type":52,"value":727},"What goes in the call",{"type":46,"tag":111,"props":729,"children":730},{},[731,767],{"type":46,"tag":96,"props":732,"children":733},{},[734,742,747],{"type":46,"tag":118,"props":735,"children":736},{},[737],{"type":46,"tag":61,"props":738,"children":739},{},[740],{"type":52,"value":741},"RELEASE",{"type":46,"tag":118,"props":743,"children":744},{},[745],{"type":52,"value":746},"Goes live on merge — now, or per its policy",{"type":46,"tag":118,"props":748,"children":749},{},[750,752,758,760,765],{"type":52,"value":751},"Add ",{"type":46,"tag":140,"props":753,"children":755},{"className":754},[],[756],{"type":52,"value":757},"{ environmentKey, releaseType }",{"type":52,"value":759}," to the ",{"type":46,"tag":140,"props":761,"children":763},{"className":762},[],[764],{"type":52,"value":309},{"type":52,"value":766}," array",{"type":46,"tag":96,"props":768,"children":769},{},[770,778,783],{"type":46,"tag":118,"props":771,"children":772},{},[773],{"type":46,"tag":61,"props":774,"children":775},{},[776],{"type":52,"value":777},"HOLD",{"type":46,"tag":118,"props":779,"children":780},{},[781],{"type":52,"value":782},"Not yet — waiting on a date, sign-off, segment, or parent flag",{"type":46,"tag":118,"props":784,"children":785},{},[786,791,793,798],{"type":46,"tag":61,"props":787,"children":788},{},[789],{"type":52,"value":790},"Nothing.",{"type":52,"value":792}," Leave it out of ",{"type":46,"tag":140,"props":794,"children":796},{"className":795},[],[797],{"type":52,"value":309},{"type":52,"value":799}," entirely; name it as held in your report",{"type":46,"tag":801,"props":802,"children":803},"br",{},[],{"type":46,"tag":140,"props":805,"children":807},{"className":806},[],[808],{"type":52,"value":635},{"type":52,"value":810}," (",{"type":46,"tag":140,"props":812,"children":814},{"className":813},[],[815],{"type":52,"value":435},{"type":52,"value":437},{"type":46,"tag":140,"props":818,"children":820},{"className":819},[],[821],{"type":52,"value":244},{"type":52,"value":823},") only chooses ",{"type":46,"tag":124,"props":825,"children":826},{},[827],{"type":52,"value":828},"how",{"type":52,"value":830}," a RELEASE environment goes live — it never holds one. ",{"type":46,"tag":61,"props":832,"children":833},{},[834],{"type":52,"value":835},"Both release on merge:",{"type":52,"value":255},{"type":46,"tag":140,"props":838,"children":840},{"className":839},[],[841],{"type":52,"value":435},{"type":52,"value":843}," serves ",{"type":46,"tag":140,"props":845,"children":847},{"className":846},[],[848],{"type":52,"value":849},"true",{"type":52,"value":851}," immediately; ",{"type":46,"tag":140,"props":853,"children":855},{"className":854},[],[856],{"type":52,"value":244},{"type":52,"value":858}," runs that environment's policy (immediate \u002F progressive \u002F guarded) automatically, with no human promotion step. \"",{"type":46,"tag":140,"props":860,"children":862},{"className":861},[],[863],{"type":52,"value":244},{"type":52,"value":865}," defers to the ",{"type":46,"tag":124,"props":867,"children":868},{},[869],{"type":52,"value":244},{"type":52,"value":871},"\" — not to you, and not until a date. ",{"type":46,"tag":61,"props":873,"children":874},{},[875,877,882,884,889],{"type":52,"value":876},"Do not reach for ",{"type":46,"tag":140,"props":878,"children":880},{"className":879},[],[881],{"type":52,"value":244},{"type":52,"value":883}," to park a held environment: it ships that environment on merge, before any ",{"type":46,"tag":140,"props":885,"children":887},{"className":886},[],[888],{"type":52,"value":296},{"type":52,"value":451},{"type":52,"value":891}," The only encoding of a hold is ",{"type":46,"tag":124,"props":893,"children":894},{},[895],{"type":52,"value":896},"absence from the array",{"type":52,"value":451},{"type":46,"tag":326,"props":899,"children":900},{},[901,913,915,920,922,927,929,935,936,941,942,947,949,954,956,961,963,966,968,973,975,1244,1247,1253],{"type":46,"tag":61,"props":902,"children":903},{},[904,906,911],{"type":52,"value":905},"Build ",{"type":46,"tag":140,"props":907,"children":909},{"className":908},[],[910],{"type":52,"value":309},{"type":52,"value":912}," from the RELEASE bucket only — then read the keys back.",{"type":52,"value":914}," The array must contain every RELEASE environment and no HOLD environment. Before you send the call, scan the ",{"type":46,"tag":140,"props":916,"children":918},{"className":917},[],[919],{"type":52,"value":535},{"type":52,"value":921},"s in the array: if any environment you're holding appears there, delete that entry. The call has ",{"type":46,"tag":61,"props":923,"children":924},{},[925],{"type":52,"value":926},"no field for a date or a hold",{"type":52,"value":928}," — if you catch yourself wanting to add ",{"type":46,"tag":140,"props":930,"children":932},{"className":931},[],[933],{"type":52,"value":934},"holdUntil",{"type":52,"value":582},{"type":46,"tag":140,"props":937,"children":939},{"className":938},[],[940],{"type":52,"value":296},{"type":52,"value":356},{"type":46,"tag":140,"props":943,"children":945},{"className":944},[],[946],{"type":52,"value":587},{"type":52,"value":948}," to an entry (or to keep it as ",{"type":46,"tag":140,"props":950,"children":952},{"className":951},[],[953],{"type":52,"value":244},{"type":52,"value":955}," \"so it waits\"), that is the signal the environment is HOLD: ",{"type":46,"tag":61,"props":957,"children":958},{},[959],{"type":52,"value":960},"drop the entry, don't invent a field.",{"type":52,"value":962}," The date and reason go in your report, not the call.",{"type":46,"tag":801,"props":964,"children":965},{},[],{"type":52,"value":967},"Worked example — ",{"type":46,"tag":124,"props":969,"children":970},{},[971],{"type":52,"value":972},"\"release staging on merge, hold production until 2026-09-01\"",{"type":52,"value":974},": staging is RELEASE, production is HOLD.",{"type":46,"tag":976,"props":977,"children":982},"pre",{"className":978,"code":979,"language":980,"meta":981,"style":981},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"projectKey\": \"default\",\n  \"flagKey\": \"new-checkout-flow\",\n  \"environments\": [{ \"environmentKey\": \"staging\", \"releaseType\": \"simple\" }],\n  \"repoFullName\": \"acme\u002Fstorefront\",\n  \"prNumber\": 482\n}\n","json","",[983],{"type":46,"tag":140,"props":984,"children":985},{"__ignoreMap":981},[986,998,1043,1080,1173,1210,1235],{"type":46,"tag":987,"props":988,"children":991},"span",{"class":989,"line":990},"line",1,[992],{"type":46,"tag":987,"props":993,"children":995},{"style":994},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[996],{"type":52,"value":997},"{\n",{"type":46,"tag":987,"props":999,"children":1001},{"class":989,"line":1000},2,[1002,1007,1013,1018,1023,1028,1034,1038],{"type":46,"tag":987,"props":1003,"children":1004},{"style":994},[1005],{"type":52,"value":1006},"  \"",{"type":46,"tag":987,"props":1008,"children":1010},{"style":1009},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1011],{"type":52,"value":1012},"projectKey",{"type":46,"tag":987,"props":1014,"children":1015},{"style":994},[1016],{"type":52,"value":1017},"\"",{"type":46,"tag":987,"props":1019,"children":1020},{"style":994},[1021],{"type":52,"value":1022},":",{"type":46,"tag":987,"props":1024,"children":1025},{"style":994},[1026],{"type":52,"value":1027}," \"",{"type":46,"tag":987,"props":1029,"children":1031},{"style":1030},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1032],{"type":52,"value":1033},"default",{"type":46,"tag":987,"props":1035,"children":1036},{"style":994},[1037],{"type":52,"value":1017},{"type":46,"tag":987,"props":1039,"children":1040},{"style":994},[1041],{"type":52,"value":1042},",\n",{"type":46,"tag":987,"props":1044,"children":1046},{"class":989,"line":1045},3,[1047,1051,1055,1059,1063,1067,1072,1076],{"type":46,"tag":987,"props":1048,"children":1049},{"style":994},[1050],{"type":52,"value":1006},{"type":46,"tag":987,"props":1052,"children":1053},{"style":1009},[1054],{"type":52,"value":528},{"type":46,"tag":987,"props":1056,"children":1057},{"style":994},[1058],{"type":52,"value":1017},{"type":46,"tag":987,"props":1060,"children":1061},{"style":994},[1062],{"type":52,"value":1022},{"type":46,"tag":987,"props":1064,"children":1065},{"style":994},[1066],{"type":52,"value":1027},{"type":46,"tag":987,"props":1068,"children":1069},{"style":1030},[1070],{"type":52,"value":1071},"new-checkout-flow",{"type":46,"tag":987,"props":1073,"children":1074},{"style":994},[1075],{"type":52,"value":1017},{"type":46,"tag":987,"props":1077,"children":1078},{"style":994},[1079],{"type":52,"value":1042},{"type":46,"tag":987,"props":1081,"children":1083},{"class":989,"line":1082},4,[1084,1088,1092,1096,1100,1105,1109,1114,1118,1122,1126,1131,1135,1140,1144,1148,1152,1156,1160,1164,1168],{"type":46,"tag":987,"props":1085,"children":1086},{"style":994},[1087],{"type":52,"value":1006},{"type":46,"tag":987,"props":1089,"children":1090},{"style":1009},[1091],{"type":52,"value":309},{"type":46,"tag":987,"props":1093,"children":1094},{"style":994},[1095],{"type":52,"value":1017},{"type":46,"tag":987,"props":1097,"children":1098},{"style":994},[1099],{"type":52,"value":1022},{"type":46,"tag":987,"props":1101,"children":1102},{"style":994},[1103],{"type":52,"value":1104}," [{",{"type":46,"tag":987,"props":1106,"children":1107},{"style":994},[1108],{"type":52,"value":1027},{"type":46,"tag":987,"props":1110,"children":1112},{"style":1111},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1113],{"type":52,"value":535},{"type":46,"tag":987,"props":1115,"children":1116},{"style":994},[1117],{"type":52,"value":1017},{"type":46,"tag":987,"props":1119,"children":1120},{"style":994},[1121],{"type":52,"value":1022},{"type":46,"tag":987,"props":1123,"children":1124},{"style":994},[1125],{"type":52,"value":1027},{"type":46,"tag":987,"props":1127,"children":1128},{"style":1030},[1129],{"type":52,"value":1130},"staging",{"type":46,"tag":987,"props":1132,"children":1133},{"style":994},[1134],{"type":52,"value":1017},{"type":46,"tag":987,"props":1136,"children":1137},{"style":994},[1138],{"type":52,"value":1139},",",{"type":46,"tag":987,"props":1141,"children":1142},{"style":994},[1143],{"type":52,"value":1027},{"type":46,"tag":987,"props":1145,"children":1146},{"style":1111},[1147],{"type":52,"value":635},{"type":46,"tag":987,"props":1149,"children":1150},{"style":994},[1151],{"type":52,"value":1017},{"type":46,"tag":987,"props":1153,"children":1154},{"style":994},[1155],{"type":52,"value":1022},{"type":46,"tag":987,"props":1157,"children":1158},{"style":994},[1159],{"type":52,"value":1027},{"type":46,"tag":987,"props":1161,"children":1162},{"style":1030},[1163],{"type":52,"value":435},{"type":46,"tag":987,"props":1165,"children":1166},{"style":994},[1167],{"type":52,"value":1017},{"type":46,"tag":987,"props":1169,"children":1170},{"style":994},[1171],{"type":52,"value":1172}," }],\n",{"type":46,"tag":987,"props":1174,"children":1176},{"class":989,"line":1175},5,[1177,1181,1185,1189,1193,1197,1202,1206],{"type":46,"tag":987,"props":1178,"children":1179},{"style":994},[1180],{"type":52,"value":1006},{"type":46,"tag":987,"props":1182,"children":1183},{"style":1009},[1184],{"type":52,"value":346},{"type":46,"tag":987,"props":1186,"children":1187},{"style":994},[1188],{"type":52,"value":1017},{"type":46,"tag":987,"props":1190,"children":1191},{"style":994},[1192],{"type":52,"value":1022},{"type":46,"tag":987,"props":1194,"children":1195},{"style":994},[1196],{"type":52,"value":1027},{"type":46,"tag":987,"props":1198,"children":1199},{"style":1030},[1200],{"type":52,"value":1201},"acme\u002Fstorefront",{"type":46,"tag":987,"props":1203,"children":1204},{"style":994},[1205],{"type":52,"value":1017},{"type":46,"tag":987,"props":1207,"children":1208},{"style":994},[1209],{"type":52,"value":1042},{"type":46,"tag":987,"props":1211,"children":1212},{"class":989,"line":27},[1213,1217,1221,1225,1229],{"type":46,"tag":987,"props":1214,"children":1215},{"style":994},[1216],{"type":52,"value":1006},{"type":46,"tag":987,"props":1218,"children":1219},{"style":1009},[1220],{"type":52,"value":354},{"type":46,"tag":987,"props":1222,"children":1223},{"style":994},[1224],{"type":52,"value":1017},{"type":46,"tag":987,"props":1226,"children":1227},{"style":994},[1228],{"type":52,"value":1022},{"type":46,"tag":987,"props":1230,"children":1232},{"style":1231},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1233],{"type":52,"value":1234}," 482\n",{"type":46,"tag":987,"props":1236,"children":1238},{"class":989,"line":1237},7,[1239],{"type":46,"tag":987,"props":1240,"children":1241},{"style":994},[1242],{"type":52,"value":1243},"}\n",{"type":46,"tag":801,"props":1245,"children":1246},{},[],{"type":46,"tag":140,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":52,"value":1252},"production",{"type":52,"value":1254}," appears nowhere in the call. You report it held until 2026-09-01, with the reason (legal sign-off). Fail closed: if an environment's intent is unclear, it's HOLD, not RELEASE.",{"type":46,"tag":326,"props":1256,"children":1257},{},[1258,1263,1264,1269,1271,1276,1277,1282,1284,1289,1291,1295,1297,1301],{"type":46,"tag":61,"props":1259,"children":1260},{},[1261],{"type":52,"value":1262},"Record the rollout.",{"type":52,"value":515},{"type":46,"tag":140,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":52,"value":384},{"type":52,"value":1270}," with ",{"type":46,"tag":140,"props":1272,"children":1274},{"className":1273},[],[1275],{"type":52,"value":1012},{"type":52,"value":582},{"type":46,"tag":140,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":52,"value":528},{"type":52,"value":1283},", the RELEASE-only ",{"type":46,"tag":140,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":52,"value":309},{"type":52,"value":1290}," array, and the PR reference. If a ",{"type":46,"tag":61,"props":1292,"children":1293},{},[1294],{"type":52,"value":611},{"type":52,"value":1296}," parent flag was agreed, wire it if the MCP surface supports it; otherwise report it as a manual step. Details: ",{"type":46,"tag":135,"props":1298,"children":1299},{"href":447},[1300],{"type":52,"value":447},{"type":52,"value":451},{"type":46,"tag":326,"props":1303,"children":1304},{},[1305,1310,1312,1318,1319,1325,1327,1332],{"type":46,"tag":61,"props":1306,"children":1307},{},[1308],{"type":52,"value":1309},"Verify.",{"type":52,"value":1311}," The call returns ",{"type":46,"tag":140,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":52,"value":1317},"created",{"type":52,"value":582},{"type":46,"tag":140,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":52,"value":1324},"config_id",{"type":52,"value":1326},", and the normalized per-environment plan — record ",{"type":46,"tag":140,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":52,"value":1324},{"type":52,"value":1333},". Report only what you verified; flag anything you couldn't confirm rather than asserting it.",{"type":46,"tag":326,"props":1335,"children":1336},{},[1337,1342,1344,1349,1351,1355],{"type":46,"tag":61,"props":1338,"children":1339},{},[1340],{"type":52,"value":1341},"Report",{"type":52,"value":1343}," the per-environment release plan + ",{"type":46,"tag":140,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":52,"value":1324},{"type":52,"value":1350},"; what was ",{"type":46,"tag":61,"props":1352,"children":1353},{},[1354],{"type":52,"value":663},{"type":52,"value":1356}," (and why) versus what releases on merge; and what happens on merge (e.g. \"production resolves policy X → guarded rollout on merge; staging serves true immediately; production held until 2026-08-01 per intent\").",{"type":46,"tag":315,"props":1358,"children":1360},{"id":1359},"edge-cases",[1361],{"type":52,"value":1362},"Edge Cases",{"type":46,"tag":88,"props":1364,"children":1365},{},[1366,1382],{"type":46,"tag":92,"props":1367,"children":1368},{},[1369],{"type":46,"tag":96,"props":1370,"children":1371},{},[1372,1377],{"type":46,"tag":100,"props":1373,"children":1374},{},[1375],{"type":52,"value":1376},"Situation",{"type":46,"tag":100,"props":1378,"children":1379},{},[1380],{"type":52,"value":1381},"Action",{"type":46,"tag":111,"props":1383,"children":1384},{},[1385,1405,1418,1471,1496,1516,1529],{"type":46,"tag":96,"props":1386,"children":1387},{},[1388,1393],{"type":46,"tag":118,"props":1389,"children":1390},{},[1391],{"type":52,"value":1392},"Flag doesn't exist yet",{"type":46,"tag":118,"props":1394,"children":1395},{},[1396,1398,1403],{"type":52,"value":1397},"Stop — creation is ",{"type":46,"tag":140,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":52,"value":168},{"type":52,"value":1404},". Recording a rollout for a missing flag fails confusingly.",{"type":46,"tag":96,"props":1406,"children":1407},{},[1408,1413],{"type":46,"tag":118,"props":1409,"children":1410},{},[1411],{"type":52,"value":1412},"A rollout config already exists for this flag + PR",{"type":46,"tag":118,"props":1414,"children":1415},{},[1416],{"type":52,"value":1417},"Don't record a second one — a duplicate confuses the scheduler. Point the user at the existing config to change the plan.",{"type":46,"tag":96,"props":1419,"children":1420},{},[1421,1426],{"type":46,"tag":118,"props":1422,"children":1423},{},[1424],{"type":52,"value":1425},"Registering before the PR exists",{"type":46,"tag":118,"props":1427,"children":1428},{},[1429,1434,1436,1441,1443,1448,1450,1455,1457,1462,1464,1469],{"type":46,"tag":140,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":52,"value":435},{"type":52,"value":1435}," envs work without a PR, but ",{"type":46,"tag":140,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":52,"value":244},{"type":52,"value":1442}," envs need ",{"type":46,"tag":140,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":52,"value":346},{"type":52,"value":1449},"\u002F",{"type":46,"tag":140,"props":1451,"children":1453},{"className":1452},[],[1454],{"type":52,"value":354},{"type":52,"value":1456}," to trigger on merge. Prefer recording ",{"type":46,"tag":124,"props":1458,"children":1459},{},[1460],{"type":52,"value":1461},"after",{"type":52,"value":1463}," the PR is open; if you record early, say ",{"type":46,"tag":140,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":52,"value":244},{"type":52,"value":1470}," won't fire until the PR is wired.",{"type":46,"tag":96,"props":1472,"children":1473},{},[1474,1479],{"type":46,"tag":118,"props":1475,"children":1476},{},[1477],{"type":52,"value":1478},"No release policy matches an env",{"type":46,"tag":118,"props":1480,"children":1481},{},[1482,1487,1489,1494],{"type":46,"tag":140,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":52,"value":244},{"type":52,"value":1488}," falls back to defaults (often immediate). Tell the user; offer ",{"type":46,"tag":140,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":52,"value":435},{"type":52,"value":1495},", or point at release-policy setup.",{"type":46,"tag":96,"props":1497,"children":1498},{},[1499,1511],{"type":46,"tag":118,"props":1500,"children":1501},{},[1502,1504,1509],{"type":52,"value":1503},"User wants to hold, or set a ",{"type":46,"tag":140,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":52,"value":296},{"type":52,"value":1510}," date",{"type":46,"tag":118,"props":1512,"children":1513},{},[1514],{"type":52,"value":1515},"Skip the releasing plan for those environments; report them as held with the reason. Never silently release against stated intent.",{"type":46,"tag":96,"props":1517,"children":1518},{},[1519,1524],{"type":46,"tag":118,"props":1520,"children":1521},{},[1522],{"type":52,"value":1523},"Change depends on a parent flag not yet live",{"type":46,"tag":118,"props":1525,"children":1526},{},[1527],{"type":52,"value":1528},"Couple them with a prerequisite (set it if the MCP surface supports it); otherwise report the coupling as a required manual step. Don't let this flag release before its parent.",{"type":46,"tag":96,"props":1530,"children":1531},{},[1532,1544],{"type":46,"tag":118,"props":1533,"children":1534},{},[1535,1537,1542],{"type":52,"value":1536},"A ",{"type":46,"tag":140,"props":1538,"children":1540},{"className":1539},[],[1541],{"type":52,"value":244},{"type":52,"value":1543}," env resolves to guarded but has no relevant metric",{"type":46,"tag":118,"props":1545,"children":1546},{},[1547,1549,1554],{"type":52,"value":1548},"Say so — a guarded rollout with no meaningful metric guards nothing. Recommend ",{"type":46,"tag":140,"props":1550,"children":1552},{"className":1551},[],[1553],{"type":52,"value":435},{"type":52,"value":1555},", or point at metric setup.",{"type":46,"tag":315,"props":1557,"children":1559},{"id":1558},"what-not-to-do",[1560],{"type":52,"value":1561},"What NOT to Do",{"type":46,"tag":322,"props":1563,"children":1564},{},[1565,1582,1592,1615,1631],{"type":46,"tag":326,"props":1566,"children":1567},{},[1568,1573,1575,1580],{"type":46,"tag":61,"props":1569,"children":1570},{},[1571],{"type":52,"value":1572},"Don't create the flag or edit code",{"type":52,"value":1574}," — that's ",{"type":46,"tag":140,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":52,"value":168},{"type":52,"value":1581},". This skill only records the release.",{"type":46,"tag":326,"props":1583,"children":1584},{},[1585,1590],{"type":46,"tag":61,"props":1586,"children":1587},{},[1588],{"type":52,"value":1589},"Don't turn the flag on yourself, or toggle it after recording the config.",{"type":52,"value":1591}," The rollout owns that; double-toggling causes audit noise and confuses the scheduler.",{"type":46,"tag":326,"props":1593,"children":1594},{},[1595,1606,1608,1613],{"type":46,"tag":61,"props":1596,"children":1597},{},[1598,1600,1605],{"type":52,"value":1599},"Don't skip ",{"type":46,"tag":140,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":52,"value":400},{"type":52,"value":451},{"type":52,"value":1607}," Proposing ",{"type":46,"tag":140,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":52,"value":244},{"type":52,"value":1614}," without knowing what it resolves to is guessing.",{"type":46,"tag":326,"props":1616,"children":1617},{},[1618,1629],{"type":46,"tag":61,"props":1619,"children":1620},{},[1621,1623,1628],{"type":52,"value":1622},"Don't silently release against a stated hold\u002F",{"type":46,"tag":140,"props":1624,"children":1626},{"className":1625},[],[1627],{"type":52,"value":296},{"type":52,"value":451},{"type":52,"value":1630}," Honor intent or hold — never drop it.",{"type":46,"tag":326,"props":1632,"children":1633},{},[1634,1639],{"type":46,"tag":61,"props":1635,"children":1636},{},[1637],{"type":52,"value":1638},"Don't handle or print credentials.",{"type":52,"value":1640}," Access is injected by the environment.",{"type":46,"tag":315,"props":1642,"children":1644},{"id":1643},"references",[1645],{"type":52,"value":1646},"References",{"type":46,"tag":322,"props":1648,"children":1649},{},[1650,1677],{"type":46,"tag":326,"props":1651,"children":1652},{},[1653,1657,1659,1664,1665,1670,1672],{"type":46,"tag":135,"props":1654,"children":1655},{"href":447},[1656],{"type":52,"value":447},{"type":52,"value":1658},": the automated-rollout \u002F release-policy model, ",{"type":46,"tag":140,"props":1660,"children":1662},{"className":1661},[],[1663],{"type":52,"value":435},{"type":52,"value":437},{"type":46,"tag":140,"props":1666,"children":1668},{"className":1667},[],[1669],{"type":52,"value":244},{"type":52,"value":1671},", precedence (intent → override → policy → default), previewing, prerequisites, metric adequacy. ",{"type":46,"tag":124,"props":1673,"children":1674},{},[1675],{"type":52,"value":1676},"(Core of this skill.)",{"type":46,"tag":326,"props":1678,"children":1679},{},[1680,1690,1692,1697,1699,1704],{"type":46,"tag":135,"props":1681,"children":1683},{"href":1682},"..\u002Flaunchdarkly-guarded-rollout\u002FSKILL.md",[1684],{"type":46,"tag":140,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":52,"value":1689},"launchdarkly-guarded-rollout",{"type":52,"value":1691},": for a ",{"type":46,"tag":124,"props":1693,"children":1694},{},[1695],{"type":52,"value":1696},"bespoke",{"type":52,"value":1698}," rollout no policy expresses — set that env to ",{"type":46,"tag":140,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":52,"value":435},{"type":52,"value":1705}," here and drive the guarded rollout by hand after merge.",{"type":46,"tag":1707,"props":1708,"children":1709},"style",{},[1710],{"type":52,"value":1711},"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":1713,"total":1845},[1714,1731,1740,1754,1765,1775,1783,1797,1808,1817,1827,1836],{"slug":1715,"name":1715,"fn":1716,"description":1717,"org":1718,"tags":1719,"stars":23,"repoUrl":24,"updatedAt":1730},"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},[1720,1723,1726,1727],{"name":1721,"slug":1722,"type":15},"Agents","agents",{"name":1724,"slug":1725,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":1728,"slug":1729,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1732,"name":1732,"fn":1733,"description":1734,"org":1735,"tags":1736,"stars":23,"repoUrl":24,"updatedAt":1739},"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},[1737,1738],{"name":1721,"slug":1722,"type":15},{"name":1724,"slug":1725,"type":15},"2026-05-22T06:55:56.527064",{"slug":1741,"name":1741,"fn":1742,"description":1743,"org":1744,"tags":1745,"stars":23,"repoUrl":24,"updatedAt":1753},"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},[1746,1749,1750],{"name":1747,"slug":1748,"type":15},"Analytics","analytics",{"name":9,"slug":8,"type":15},{"name":1751,"slug":1752,"type":15},"Metrics","metrics","2026-05-22T06:55:53.858749",{"slug":1755,"name":1755,"fn":1756,"description":1757,"org":1758,"tags":1759,"stars":23,"repoUrl":24,"updatedAt":1764},"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},[1760,1761],{"name":9,"slug":8,"type":15},{"name":1762,"slug":1763,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1766,"name":1766,"fn":1767,"description":1768,"org":1769,"tags":1770,"stars":23,"repoUrl":24,"updatedAt":1774},"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},[1771,1772,1773],{"name":1747,"slug":1748,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1776,"name":1776,"fn":1777,"description":1778,"org":1779,"tags":1780,"stars":23,"repoUrl":24,"updatedAt":1782},"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},[1781],{"name":1762,"slug":1763,"type":15},"2026-05-22T06:55:44.464733",{"slug":1784,"name":1784,"fn":1785,"description":1786,"org":1787,"tags":1788,"stars":23,"repoUrl":24,"updatedAt":1796},"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},[1789,1792,1793],{"name":1790,"slug":1791,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1794,"slug":1795,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",{"slug":1798,"name":1798,"fn":1799,"description":1800,"org":1801,"tags":1802,"stars":23,"repoUrl":24,"updatedAt":1807},"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},[1803,1806],{"name":1804,"slug":1805,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1809,"name":1809,"fn":1810,"description":1811,"org":1812,"tags":1813,"stars":23,"repoUrl":24,"updatedAt":1816},"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},[1814,1815],{"name":1804,"slug":1805,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1818,"name":1818,"fn":1819,"description":1820,"org":1821,"tags":1822,"stars":23,"repoUrl":24,"updatedAt":1826},"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},[1823,1824,1825],{"name":1804,"slug":1805,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1828,"name":1828,"fn":1829,"description":1830,"org":1831,"tags":1832,"stars":23,"repoUrl":24,"updatedAt":1835},"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},[1833,1834],{"name":9,"slug":8,"type":15},{"name":1762,"slug":1763,"type":15},"2026-05-22T06:55:39.13373",{"slug":1837,"name":1837,"fn":1838,"description":1839,"org":1840,"tags":1841,"stars":23,"repoUrl":24,"updatedAt":1844},"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},[1842,1843],{"name":9,"slug":8,"type":15},{"name":1762,"slug":1763,"type":15},"2026-05-22T06:55:40.464884",49,{"items":1847,"total":1845},[1848,1855,1860,1866,1871,1877,1881],{"slug":1715,"name":1715,"fn":1716,"description":1717,"org":1849,"tags":1850,"stars":23,"repoUrl":24,"updatedAt":1730},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1851,1852,1853,1854],{"name":1721,"slug":1722,"type":15},{"name":1724,"slug":1725,"type":15},{"name":9,"slug":8,"type":15},{"name":1728,"slug":1729,"type":15},{"slug":1732,"name":1732,"fn":1733,"description":1734,"org":1856,"tags":1857,"stars":23,"repoUrl":24,"updatedAt":1739},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1858,1859],{"name":1721,"slug":1722,"type":15},{"name":1724,"slug":1725,"type":15},{"slug":1741,"name":1741,"fn":1742,"description":1743,"org":1861,"tags":1862,"stars":23,"repoUrl":24,"updatedAt":1753},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1863,1864,1865],{"name":1747,"slug":1748,"type":15},{"name":9,"slug":8,"type":15},{"name":1751,"slug":1752,"type":15},{"slug":1755,"name":1755,"fn":1756,"description":1757,"org":1867,"tags":1868,"stars":23,"repoUrl":24,"updatedAt":1764},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1869,1870],{"name":9,"slug":8,"type":15},{"name":1762,"slug":1763,"type":15},{"slug":1766,"name":1766,"fn":1767,"description":1768,"org":1872,"tags":1873,"stars":23,"repoUrl":24,"updatedAt":1774},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1874,1875,1876],{"name":1747,"slug":1748,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":1776,"name":1776,"fn":1777,"description":1778,"org":1878,"tags":1879,"stars":23,"repoUrl":24,"updatedAt":1782},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1880],{"name":1762,"slug":1763,"type":15},{"slug":1784,"name":1784,"fn":1785,"description":1786,"org":1882,"tags":1883,"stars":23,"repoUrl":24,"updatedAt":1796},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1884,1885,1886],{"name":1790,"slug":1791,"type":15},{"name":9,"slug":8,"type":15},{"name":1794,"slug":1795,"type":15}]