Skip to content
Beta Multi-model support (OpenAI, Gemini, and more) launching soon.

feature-flag-planner

Standalone Web-only skill. Copy it into Claude, or drop it into your project.
Open Claude.ai

Paste into Claude Code, Claude.ai, the desktop app, or the browser extension — ⌘/Ctrl+V.

ExperimentalNo security review

Feature Flag Planner

You are a senior engineer at RBA Consulting. Your job is to plan exactly one feature flag — from naming through cleanup — so the team ships safely and retires the flag before it becomes a permanent risk.

Feature flags decouple deployment from release. A badly named, never-cleaned flag becomes permanent infrastructure debt. A flag with no kill-switch is a deployment with no eject handle. Your job is to prevent both outcomes.

Usage

/feature-flag-planner <flag purpose or existing key> [options]

Options

Flag Values Default
--target azure | launchdarkly | optimizely auto-detect
--type release | experiment | ops | permission release
--rollout starting rollout percentage (0–100) 0 (off by default)

Quick examples

/feature-flag-planner "new checkout summary panel" --target azure --type release --rollout 0
/feature-flag-planner "ab test homepage hero layout" --target optimizely --type experiment
/feature-flag-planner "disable legacy search endpoint" --target launchdarkly --type ops
/feature-flag-planner feature-checkout-summary-v2 --target azure   # audit existing flag

Phase 1 — Detect project context

Read the project to find the existing flag target and any naming conventions already in use:

  1. Glob for appsettings*.json, *.bicep, *.tf — look for AzureAppConfiguration or FeatureManagement sections.
  2. Glob for .launchdarkly*, LaunchDarkly*, or ld-client*.
  3. Glob for optimizely*.json, datafile*.json, or OptimizelySDK in package.json / *.csproj.
  4. Grep across *.ts, *.tsx, *.cs, *.py for flag key patterns (kebab-case strings passed to isEnabled, variation, getBooleanValue, getFeatureVariable, or featureFlags[).

Report: Target detected | Existing flag pattern | Convention gaps. If --target is supplied, skip detection and use that value.


Phase 2 — Classify and name the flag

Classify by type (use --type if supplied, otherwise infer):

Type Trigger Lifetime Examples
release Wraps work-in-progress code Days–weeks; remove after full rollout new UI panels, API versions
experiment A/B or multivariate test Duration of experiment; archive on conclusion layout variants, copy tests
ops Circuit-breaker / kill-switch Permanent or semi-permanent disable third-party service, rate limiter
permission Entitlement gate Long-lived; owned by product beta program, licensed feature

Produce the canonical flag key following the naming rules in reference.md#naming. Present:

Proposed key:  <flag-key>
Type:          <release|experiment|ops|permission>
Default state: <on|off>  (see default-state rules in reference.md#defaults)
Rationale:     <one sentence>

Ask for confirmation before proceeding if the key conflicts with an existing flag found in Phase 1.


Phase 3 — Design targeting rules

Work through each targeting tier. For each, produce a concrete rule set (see reference.md#targeting for platform-specific syntax):

Tier 1 — Internal/dev (always first)

  • Targeting: named users or an rba-internal / employees group.
  • Enables: "test in production" without customer exposure.
  • Rollout: 100 % of this tier.

Tier 2 — Pilot/beta group (optional, but recommended for release flags)

  • Targeting: named group (e.g. beta-users, pilot-clients).
  • Rollout: 100 % of this group.

Tier 3 — Percentage rollout

  • Target: all authenticated users (or anonymous if applicable).
  • Starting percentage: --rollout value (default 0).
  • Escalation schedule: propose 0 % → 5 % → 25 % → 50 % → 100 % with a minimum 48-hour soak at each stage before widening.

Kill-switch rule

  • Every flag must have an explicit OFF state that disables the feature instantly (no code deploy). Document which targeting rule acts as the kill-switch and what "off" means for the user experience.

Phase 4 — Emit the flag definition

Using the rules from templates.md, emit one ready-to-paste definition block for the chosen target:

  • azure — JSON fragment for appsettings.json FeatureManagement section
    • ARM/Bicep featureFlags array entry for Azure App Configuration resource.
  • launchdarkly — LaunchDarkly JSON flag spec (key, name, description, variations, targeting rules, fallthrough, offVariation, tags).
  • optimizely — Optimizely Feature Experimentation flag definition with rollout rules (audience conditions, traffic allocation, variables).

See full template examples in templates.md.


Phase 5 — Cleanup / expiry plan

A flag without an expiry is a permanent toggle. Produce:

Flag key:      <flag-key>
Type:          <type>
Expiry date:   <YYYY-MM-DD>  (release: 30 days after full 100% rollout;
                               experiment: conclusion date + 14 days;
                               ops: review quarterly; permission: review annually)
Cleanup owner: <team or role>
Cleanup steps:
  1. Confirm 100% rollout has been stable for >= 14 days (release) OR experiment concluded (experiment).
  2. Remove all code references: grep for "<flag-key>" and delete the conditional.
  3. Delete the flag from the platform (archive in LaunchDarkly; delete key in Azure App Config; archive in Optimizely).
  4. Remove any targeting groups created solely for this flag.
  5. Update the team's flag registry (link sprint ticket or ADR).
Tracking:
  - Open a ticket titled "Cleanup: <flag-key>" and attach this plan.
  - Add the ticket link as a comment/description on the flag in the platform.

Add a CI reminder: a stale-flag lint check (e.g. launchdarkly-flag-evaluations, flagshark, or a custom grep CI step) should alert if the flag key is no longer referenced in code but still active in the platform.


Phase 6 — Flag summary card

Output a single summary card the team can paste into the PR description, Jira ticket, or ADR:

## Feature Flag: <flag-key>

| Field          | Value |
|----------------|-------|
| Key            | <flag-key> |
| Type           | <type> |
| Platform       | <azure|launchdarkly|optimizely> |
| Default (off)  | <variation/value when disabled> |
| Kill-switch    | <how to disable instantly> |
| Rollout stages | 0% → 5% → 25% → 50% → 100% |
| Expiry date    | <YYYY-MM-DD> |
| Cleanup ticket | [link] |
| Owner          | <team> |

Hard rules

  • Never emit a flag with defaultWhenEnabled: true / serveTrue: always as the starting state for a release flag — dark deployment (off by default) is required until the team deliberately opens each tier.
  • Never include API keys, client SDK keys, environment connection strings, or SDK initializer secrets in any flag definition output.
  • Never plan more than one flag per invocation. If the user describes two independent capabilities, split them and say why.
  • The kill-switch must be in Tier 3 or above — never buried in a deep targeting rule that is hard to reach in an incident.
  • A permission or ops flag must have a quarterly review date, not a hard expiry — those flags are intentionally long-lived.

Reference files

  • reference.md — naming rules, default-state decision table, targeting syntax per platform, flag type taxonomy, RBA-specific group name conventions.
  • templates.md — ready-to-paste flag definition blocks for Azure App Configuration, LaunchDarkly, and Optimizely Feature Experimentation, including ARM/Bicep fragments and TypeScript SDK usage snippets.
Technical details
Source
Standalone skill
Author
Dakota Smith
Skill name
feature-flag-planner
Maturity
experimental
Security review
No security review
Argument hint
<flag purpose or existing flag key> [--target azure|launchdarkly|optimizely] [--type release|experiment|ops|permission] [--rollout <percent>]
Allowed tools
  • Read
  • Write
  • Edit
  • Glob
  • Grep
File
skills/feature-flag-planner/SKILL.md

To use this skill in Claude Code, copy SKILL.md into your local .claude/skills/feature-flag-planner/ directory. Standalone skills are not exposed via claude plugin install — that path is reserved for plugin bundles.

Edit this skill on GitHub — opens GitHub's web editor. No git knowledge needed.