[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F6B4925TZ2DR0FEXWTWPSQ":3,"skill-same:01M6F6B4925TZ2DR0FEXWTWPSQ":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":28,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":59,"install":60,"resources":73},"01M6F6B4925TZ2DR0FEXWTWPSQ","feature-flags",null,"Implement feature flags for progressive feature rollout using LaunchDarkly, Unleash, or custom solutions.","boisenoise\u002Fskills-collections","boisenoise","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193180?v=4","01M6CDBDQK6BDN55ZMA6B6PKBM","01M6CDBDVSJ3JPTBYN26FZ7TZK",12,"MIT","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-feature-flags\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"feature flags","feature","flags","only","2026","solutions","relevant","scripts","critical","platform","main","community","security","unleash","launchdarkly","rollout","environment","access","devops-security","kubectl","ci","git","2026-11-10 10:12:30",false,"---\nname: feature-flags\ndescription: Implement feature flags for progressive feature rollout using LaunchDarkly,\n  Unleash, or custom solutions.\ncategory: devops\nrisk: critical\nsource: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\nsource_repo: BagelHole\u002FDevOps-Security-Agent-Skills\nsource_type: community\ndate_added: '2026-09-20'\nlicense: MIT\nlicense_source: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE\ncompatibility: Requires the relevant platform CLIs (kubectl, helm, terraform, git,\n  CI runners) and authorized access to the target environment. Docs-only; helper scripts\n  and templates not bundled.\nmetadata:\n  author: devops-skills\n  version: '1.0'\n---\n\n# Feature Flags\n\nControl feature releases and enable progressive rollout with feature flag systems.\n\n## Prerequisites\n\n- Application code access\n- Feature flag service or self-hosted solution\n- Basic understanding of deployment patterns\n\n## Feature Flag Types\n\n| Type | Purpose | Example |\n|------|---------|---------|\n| Release | Control feature visibility | New checkout flow |\n| Experiment | A\u002FB testing | Button color test |\n| Ops | Runtime configuration | Rate limiting |\n| Entitlement presentation | Display already-authorized features | Premium UI visibility |\n| Kill Switch | Emergency disable | Third-party integration |\n\nFeature flags do not replace server-side authorization. Never trust client evaluation or a client-supplied identity for access to protected data or paid operations. Keep server SDK keys out of browsers; minimize personal attributes sent to providers. SDK snippets are historical sketches: pin compatible package versions and verify current schemas. Custom examples omit storage\u002Frule helpers and production error\u002Fcache handling.\n\n## LaunchDarkly\n\n### SDK Setup (Node.js)\n\n```javascript\nconst LaunchDarkly = require('launchdarkly-node-server-sdk');\n\nconst client = LaunchDarkly.init(process.env.LAUNCHDARKLY_SDK_KEY);\n\nawait client.waitForInitialization();\n\n\u002F\u002F Evaluate flag\nconst user = {\n  key: 'user-123',\n  email: 'user@example.com',\n  custom: {\n    plan: 'premium',\n    company: 'acme'\n  }\n};\n\nconst showNewFeature = await client.variation('new-checkout', user, false);\n\nif (showNewFeature) {\n  \u002F\u002F New feature code\n} else {\n  \u002F\u002F Existing code\n}\n```\n\n### React SDK\n\n```javascript\nimport { withLDProvider, useFlags, useLDClient } from 'launchdarkly-react-client-sdk';\n\n\u002F\u002F Provider setup\nexport default withLDProvider({\n  clientSideID: 'your-client-side-id',\n  user: {\n    key: 'user-123',\n    email: 'user@example.com'\n  }\n})(App);\n\n\u002F\u002F Using flags in component\nfunction FeatureComponent() {\n  const { newCheckout, experimentVariant } = useFlags();\n  const ldClient = useLDClient();\n\n  \u002F\u002F Track events\n  const handleClick = () => {\n    ldClient?.track('checkout-started');\n  };\n\n  if (newCheckout) {\n    return \u003CNewCheckout onClick={handleClick} \u002F>;\n  }\n  return \u003COldCheckout onClick={handleClick} \u002F>;\n}\n```\n\n### Targeting Rules\n\n```yaml\n# LaunchDarkly targeting configuration\nflag: new-checkout\ntargeting:\n  # Individual users\n  targets:\n    - variation: true\n      values: ['user-123', 'user-456']\n  \n  # Rules\n  rules:\n    # Beta users\n    - variation: true\n      clauses:\n        - attribute: email\n          op: endsWith\n          values: ['@company.com']\n    \n    # Premium plan\n    - variation: true\n      clauses:\n        - attribute: plan\n          op: in\n          values: ['premium', 'enterprise']\n    \n    # Percentage rollout\n    - variation: true\n      rollout:\n        variations:\n          - variation: true\n            weight: 20000  # 20%\n          - variation: false\n            weight: 80000  # 80%\n  \n  # Default\n  fallthrough:\n    variation: false\n```\n\n## Unleash\n\n### Local Development Server Setup\n\nDisposable local demonstration only: replace the image tag with a reviewed digest and supply a unique local database password through ignored environment configuration. Do not expose this service publicly or reuse these settings in production.\n\n```yaml\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n  unleash:\n    image: unleashorg\u002Funleash-server:\u003Creviewed-version-or-digest>\n    ports:\n      - \"127.0.0.1:4242:4242\"\n    environment:\n      - DATABASE_URL=postgres:\u002F\u002Fpostgres:${UNLEASH_DB_PASSWORD:?set local password}@db\u002Funleash\n      - DATABASE_SSL=false\n    depends_on:\n      - db\n\n  db:\n    image: postgres:15\n    environment:\n      - POSTGRES_PASSWORD=${UNLEASH_DB_PASSWORD:?set local password}\n      - POSTGRES_DB=unleash\n    volumes:\n      - postgres-data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n\nvolumes:\n  postgres-data:\n```\n\n### SDK Setup (Node.js)\n\n```javascript\nconst { initialize } = require('unleash-client');\n\nconst unleash = initialize({\n  url: 'http:\u002F\u002Flocalhost:4242\u002Fapi',\n  appName: 'my-app',\n  customHeaders: {\n    Authorization: 'your-api-token'\n  }\n});\n\nunleash.on('ready', () => {\n  \u002F\u002F Check feature\n  const isEnabled = unleash.isEnabled('new-checkout');\n  \n  \u002F\u002F With context\n  const context = {\n    userId: 'user-123',\n    properties: {\n      plan: 'premium'\n    }\n  };\n  \n  const isEnabledForUser = unleash.isEnabled('new-checkout', context);\n  \n  \u002F\u002F Get variant\n  const variant = unleash.getVariant('experiment-flag', context);\n  console.log(variant.name); \u002F\u002F 'control' or 'treatment'\n});\n```\n\n### Activation Strategies\n\n```yaml\n# Standard strategies\nstrategies:\n  - name: default\n    # On\u002Foff for everyone\n    \n  - name: userWithId\n    parameters:\n      userIds: 'user-1,user-2,user-3'\n    \n  - name: gradualRolloutUserId\n    parameters:\n      percentage: 25\n      groupId: 'new-feature'\n    \n  - name: gradualRolloutRandom\n    parameters:\n      percentage: 50\n    \n  - name: flexibleRollout\n    parameters:\n      rollout: 30\n      stickiness: userId\n      groupId: 'checkout-exp'\n```\n\n## Custom Implementation\n\n### Database-Backed Flags\n\n```python\n# models.py\nfrom django.db import models\n\nclass FeatureFlag(models.Model):\n    name = models.CharField(max_length=100, unique=True)\n    enabled = models.BooleanField(default=False)\n    rollout_percentage = models.IntegerField(default=0)\n    allowed_users = models.JSONField(default=list)\n    rules = models.JSONField(default=dict)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n\n# service.py\nimport hashlib\n\nclass FeatureFlagService:\n    def __init__(self):\n        self._cache = {}\n    \n    def is_enabled(self, flag_name, user_id=None, context=None):\n        flag = self._get_flag(flag_name)\n        \n        if not flag or not flag.enabled:\n            return False\n        \n        # Check user allowlist\n        if user_id and user_id in flag.allowed_users:\n            return True\n        \n        # Check rules\n        if context and self._evaluate_rules(flag.rules, context):\n            return True\n        \n        # Check percentage rollout\n        if flag.rollout_percentage > 0 and user_id:\n            return self._is_in_rollout(flag_name, user_id, flag.rollout_percentage)\n        \n        return flag.rollout_percentage == 100\n    \n    def _is_in_rollout(self, flag_name, user_id, percentage):\n        hash_input = f\"{flag_name}:{user_id}\"\n        hash_value = int(hashlib.md5(hash_input.encode()).hexdigest(), 16)\n        return (hash_value % 100) \u003C percentage\n    \n    def _evaluate_rules(self, rules, context):\n        for rule in rules.get('rules', []):\n            if self._evaluate_rule(rule, context):\n                return True\n        return False\n```\n\n### Redis-Backed Flags\n\n```python\nimport redis\nimport json\n\nclass RedisFeatureFlags:\n    def __init__(self, redis_url):\n        self.redis = redis.from_url(redis_url)\n        self.prefix = 'feature_flag:'\n    \n    def set_flag(self, name, config):\n        key = f\"{self.prefix}{name}\"\n        self.redis.set(key, json.dumps(config))\n    \n    def is_enabled(self, name, user_id=None):\n        key = f\"{self.prefix}{name}\"\n        data = self.redis.get(key)\n        \n        if not data:\n            return False\n        \n        config = json.loads(data)\n        \n        if not config.get('enabled', False):\n            return False\n        \n        # User allowlist\n        if user_id in config.get('users', []):\n            return True\n        \n        # Percentage rollout\n        percentage = config.get('percentage', 0)\n        if percentage == 100:\n            return True\n        \n        if percentage > 0 and user_id:\n            return self._hash_user(name, user_id) \u003C percentage\n        \n        return False\n    \n    def _hash_user(self, flag, user_id):\n        import hashlib\n        hash_input = f\"{flag}:{user_id}\"\n        return int(hashlib.sha256(hash_input.encode()).hexdigest(), 16) % 100\n```\n\n## Testing with Feature Flags\n\n### Unit Testing\n\n```javascript\n\u002F\u002F Jest mocking\njest.mock('launchdarkly-node-server-sdk', () => ({\n  init: jest.fn(() => ({\n    waitForInitialization: jest.fn().mockResolvedValue(undefined),\n    variation: jest.fn()\n  }))\n}));\n\ndescribe('Checkout', () => {\n  it('shows new checkout when flag enabled', async () => {\n    const ldClient = require('launchdarkly-node-server-sdk').init();\n    ldClient.variation.mockResolvedValue(true);\n    \n    const result = await renderCheckout(user);\n    expect(result).toContain('NewCheckout');\n  });\n  \n  it('shows old checkout when flag disabled', async () => {\n    const ldClient = require('launchdarkly-node-server-sdk').init();\n    ldClient.variation.mockResolvedValue(false);\n    \n    const result = await renderCheckout(user);\n    expect(result).toContain('OldCheckout');\n  });\n});\n```\n\n### Integration Testing\n\n```python\n# pytest sketch: client must be supplied and the application must be wired\n# to use this feature_flags test double; defining it alone does not override the app.\nimport pytest\n\n@pytest.fixture\ndef feature_flags():\n    \"\"\"Provide controllable feature flags for testing.\"\"\"\n    flags = {}\n    \n    class TestFlags:\n        def set(self, name, value):\n            flags[name] = value\n        \n        def is_enabled(self, name, **kwargs):\n            return flags.get(name, False)\n    \n    return TestFlags()\n\ndef test_new_checkout(feature_flags):\n    feature_flags.set('new-checkout', True)\n    \n    response = client.get('\u002Fcheckout')\n    assert b'new-checkout-form' in response.content\n```\n\n\n## Contents\n\n- [Monitoring and Analytics](references\u002Fdetails.md)\n- [Common Issues](references\u002Fdetails.md)\n- [Best Practices](references\u002Fdetails.md)\n- [Related Skills](references\u002Fdetails.md)\n\n## When to Use This Skill\n\nUse this skill when:\n- Implementing gradual feature rollouts\n- Enabling trunk-based development\n- Running A\u002FB tests and experiments\n- Managing feature lifecycles\n- Implementing kill switches for production\n\n## Limitations\n\n- Guidance executes against real environments: confirm target, blast radius, and rollback plan before applying anything.\n- Never deploy to production without explicit approval. Docs-only import: upstream scripts and templates not bundled.\n\n### Example\n\n```bash\ngit status && git diff --stat\nkubectl diff -f manifest.yaml\n```\n\n> Adapted from [BagelHole\u002FDevOps-Security-Agent-Skills](https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills) (MIT); frontmatter, When to Use\u002FLimitations, and safety boundaries added for upstream compliance. Docs-only import: helper scripts and templates not bundled.\n","# Feature Flags\n\nControl feature releases and enable progressive rollout with feature flag systems.\n\n## Prerequisites\n\n- Application code access\n- Feature flag service or self-hosted solution\n- Basic understanding of deployment patterns\n\n## Feature Flag Types\n\n| Type | Purpose | Example |\n|------|---------|---------|\n| Release | Control feature visibility | New checkout flow |\n| Experiment | A\u002FB testing | Button color test |\n| Ops | Runtime configuration | Rate limiting |\n| Entitlement presentation | Display already-authorized features | Premium UI visibility |\n| Kill Switch | Emergency disable | Third-party integration |\n\nFeature flags do not replace server-side authorization. Never trust client evaluation or a client-supplied identity for access to protected data or paid operations. Keep server SDK keys out of browsers; minimize personal attributes sent to providers. SDK snippets are historical sketches: pin compatible package versions and verify current schemas. Custom examples omit storage\u002Frule helpers and production error\u002Fcache handling.\n\n## LaunchDarkly\n\n### SDK Setup (Node.js)\n\n```javascript\nconst LaunchDarkly = require('launchdarkly-node-server-sdk');\n\nconst client = LaunchDarkly.init(process.env.LAUNCHDARKLY_SDK_KEY);\n\nawait client.waitForInitialization();\n\n\u002F\u002F Evaluate flag\nconst user = {\n  key: 'user-123',\n  email: 'user@example.com',\n  custom: {\n    plan: 'premium',\n    company: 'acme'\n  }\n};\n\nconst showNewFeature = await client.variation('new-checkout', user, false);\n\nif (showNewFeature) {\n  \u002F\u002F New feature code\n} else {\n  \u002F\u002F Existing code\n}\n```\n\n### React SDK\n\n```javascript\nimport { withLDProvider, useFlags, useLDClient } from 'launchdarkly-react-client-sdk';\n\n\u002F\u002F Provider setup\nexport default withLDProvider({\n  clientSideID: 'your-client-side-id',\n  user: {\n    key: 'user-123',\n    email: 'user@example.com'\n  }\n})(App);\n\n\u002F\u002F Using flags in component\nfunction FeatureComponent() {\n  const { newCheckout, experimentVariant } = useFlags();\n  const ldClient = useLDClient();\n\n  \u002F\u002F Track events\n  const handleClick = () => {\n    ldClient?.track('checkout-started');\n  };\n\n  if (newCheckout) {\n    return \u003CNewCheckout onClick={handleClick} \u002F>;\n  }\n  return \u003COldCheckout onClick={handleClick} \u002F>;\n}\n```\n\n### Targeting Rules\n\n```yaml\n# LaunchDarkly targeting configuration\nflag: new-checkout\ntargeting:\n  # Individual users\n  targets:\n    - variation: true\n      values: ['user-123', 'user-456']\n  \n  # Rules\n  rules:\n    # Beta users\n    - variation: true\n      clauses:\n        - attribute: email\n          op: endsWith\n          values: ['@company.com']\n    \n    # Premium plan\n    - variation: true\n      clauses:\n        - attribute: plan\n          op: in\n          values: ['premium', 'enterprise']\n    \n    # Percentage rollout\n    - variation: true\n      rollout:\n        variations:\n          - variation: true\n            weight: 20000  # 20%\n          - variation: false\n            weight: 80000  # 80%\n  \n  # Default\n  fallthrough:\n    variation: false\n```\n\n## Unleash\n\n### Local Development Server Setup\n\nDisposable local demonstration only: replace the image tag with a reviewed digest and supply a unique local database password through ignored environment configuration. Do not expose this service publicly or reuse these settings in production.\n\n```yaml\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n  unleash:\n    image: unleashorg\u002Funleash-server:\u003Creviewed-version-or-digest>\n    ports:\n      - \"127.0.0.1:4242:4242\"\n    environment:\n      - DATABASE_URL=postgres:\u002F\u002Fpostgres:${UNLEASH_DB_PASSWORD:?set local password}@db\u002Funleash\n      - DATABASE_SSL=false\n    depends_on:\n      - db\n\n  db:\n    image: postgres:15\n    environment:\n      - POSTGRES_PASSWORD=${UNLEASH_DB_PASSWORD:?set local password}\n      - POSTGRES_DB=unleash\n    volumes:\n      - postgres-data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n\nvolumes:\n  postgres-data:\n```\n\n### SDK Setup (Node.js)\n\n```javascript\nconst { initialize } = require('unleash-client');\n\nconst unleash = initialize({\n  url: 'http:\u002F\u002Flocalhost:4242\u002Fapi',\n  appName: 'my-app',\n  customHeaders: {\n    Authorization: 'your-api-token'\n  }\n});\n\nunleash.on('ready', () => {\n  \u002F\u002F Check feature\n  const isEnabled = unleash.isEnabled('new-checkout');\n  \n  \u002F\u002F With context\n  const context = {\n    userId: 'user-123',\n    properties: {\n      plan: 'premium'\n    }\n  };\n  \n  const isEnabledForUser = unleash.isEnabled('new-checkout', context);\n  \n  \u002F\u002F Get variant\n  const variant = unleash.getVariant('experiment-flag', context);\n  console.log(variant.name); \u002F\u002F 'control' or 'treatment'\n});\n```\n\n### Activation Strategies\n\n```yaml\n# Standard strategies\nstrategies:\n  - name: default\n    # On\u002Foff for everyone\n    \n  - name: userWithId\n    parameters:\n      userIds: 'user-1,user-2,user-3'\n    \n  - name: gradualRolloutUserId\n    parameters:\n      percentage: 25\n      groupId: 'new-feature'\n    \n  - name: gradualRolloutRandom\n    parameters:\n      percentage: 50\n    \n  - name: flexibleRollout\n    parameters:\n      rollout: 30\n      stickiness: userId\n      groupId: 'checkout-exp'\n```\n\n## Custom Implementation\n\n### Database-Backed Flags\n\n```python\n# models.py\nfrom django.db import models\n\nclass FeatureFlag(models.Model):\n    name = models.CharField(max_length=100, unique=True)\n    enabled = models.BooleanField(default=False)\n    rollout_percentage = models.IntegerField(default=0)\n    allowed_users = models.JSONField(default=list)\n    rules = models.JSONField(default=dict)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n\n# service.py\nimport hashlib\n\nclass FeatureFlagService:\n    def __init__(self):\n        self._cache = {}\n    \n    def is_enabled(self, flag_name, user_id=None, context=None):\n        flag = self._get_flag(flag_name)\n        \n        if not flag or not flag.enabled:\n            return False\n        \n        # Check user allowlist\n        if user_id and user_id in flag.allowed_users:\n            return True\n        \n        # Check rules\n        if context and self._evaluate_rules(flag.rules, context):\n            return True\n        \n        # Check percentage rollout\n        if flag.rollout_percentage > 0 and user_id:\n            return self._is_in_rollout(flag_name, user_id, flag.rollout_percentage)\n        \n        return flag.rollout_percentage == 100\n    \n    def _is_in_rollout(self, flag_name, user_id, percentage):\n        hash_input = f\"{flag_name}:{user_id}\"\n        hash_value = int(hashlib.md5(hash_input.encode()).hexdigest(), 16)\n        return (hash_value % 100) \u003C percentage\n    \n    def _evaluate_rules(self, rules, context):\n        for rule in rules.get('rules', []):\n            if self._evaluate_rule(rule, context):\n                return True\n        return False\n```\n\n### Redis-Backed Flags\n\n```python\nimport redis\nimport json\n\nclass RedisFeatureFlags:\n    def __init__(self, redis_url):\n        self.redis = redis.from_url(redis_url)\n        self.prefix = 'feature_flag:'\n    \n    def set_flag(self, name, config):\n        key = f\"{self.prefix}{name}\"\n        self.redis.set(key, json.dumps(config))\n    \n    def is_enabled(self, name, user_id=None):\n        key = f\"{self.prefix}{name}\"\n        data = self.redis.get(key)\n        \n        if not data:\n            return False\n        \n        config = json.loads(data)\n        \n        if not config.get('enabled', False):\n            return False\n        \n        # User allowlist\n        if user_id in config.get('users', []):\n            return True\n        \n        # Percentage rollout\n        percentage = config.get('percentage', 0)\n        if percentage == 100:\n            return True\n        \n        if percentage > 0 and user_id:\n            return self._hash_user(name, user_id) \u003C percentage\n        \n        return False\n    \n    def _hash_user(self, flag, user_id):\n        import hashlib\n        hash_input = f\"{flag}:{user_id}\"\n        return int(hashlib.sha256(hash_input.encode()).hexdigest(), 16) % 100\n```\n\n## Testing with Feature Flags\n\n### Unit Testing\n\n```javascript\n\u002F\u002F Jest mocking\njest.mock('launchdarkly-node-server-sdk', () => ({\n  init: jest.fn(() => ({\n    waitForInitialization: jest.fn().mockResolvedValue(undefined),\n    variation: jest.fn()\n  }))\n}));\n\ndescribe('Checkout', () => {\n  it('shows new checkout when flag enabled', async () => {\n    const ldClient = require('launchdarkly-node-server-sdk').init();\n    ldClient.variation.mockResolvedValue(true);\n    \n    const result = await renderCheckout(user);\n    expect(result).toContain('NewCheckout');\n  });\n  \n  it('shows old checkout when flag disabled', async () => {\n    const ldClient = require('launchdarkly-node-server-sdk').init();\n    ldClient.variation.mockResolvedValue(false);\n    \n    const result = await renderCheckout(user);\n    expect(result).toContain('OldCheckout');\n  });\n});\n```\n\n### Integration Testing\n\n```python\n# pytest sketch: client must be supplied and the application must be wired\n# to use this feature_flags test double; defining it alone does not override the app.\nimport pytest\n\n@pytest.fixture\ndef feature_flags():\n    \"\"\"Provide controllable feature flags for testing.\"\"\"\n    flags = {}\n    \n    class TestFlags:\n        def set(self, name, value):\n            flags[name] = value\n        \n        def is_enabled(self, name, **kwargs):\n            return flags.get(name, False)\n    \n    return TestFlags()\n\ndef test_new_checkout(feature_flags):\n    feature_flags.set('new-checkout', True)\n    \n    response = client.get('\u002Fcheckout')\n    assert b'new-checkout-form' in response.content\n```\n\n\n## Contents\n\n- [Monitoring and Analytics](references\u002Fdetails.md)\n- [Common Issues](references\u002Fdetails.md)\n- [Best Practices](references\u002Fdetails.md)\n- [Related Skills](references\u002Fdetails.md)\n\n## When to Use This Skill\n\nUse this skill when:\n- Implementing gradual feature rollouts\n- Enabling trunk-based development\n- Running A\u002FB tests and experiments\n- Managing feature lifecycles\n- Implementing kill switches for production\n\n## Limitations\n\n- Guidance executes against real environments: confirm target, blast radius, and rollback plan before applying anything.\n- Never deploy to production without explicit approval. Docs-only import: upstream scripts and templates not bundled.\n\n### Example\n\n```bash\ngit status && git diff --stat\nkubectl diff -f manifest.yaml\n```\n\n> Adapted from [BagelHole\u002FDevOps-Security-Agent-Skills](https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills) (MIT); frontmatter, When to Use\u002FLimitations, and safety boundaries added for upstream compliance. Docs-only import: helper scripts and templates not bundled.\n",{"name":5,"risk":26,"source":45,"license":14,"category":46,"metadata":47,"date_added":50,"description":7,"source_repo":51,"source_type":29,"compatibility":52,"license_source":53},"https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills","devops",{"author":48,"version":49},"devops-skills","1.0","2026-09-20","BagelHole\u002FDevOps-Security-Agent-Skills","Requires the relevant platform CLIs (kubectl, helm, terraform, git, CI runners) and authorized access to the target environment. Docs-only; helper scripts and templates not bundled.","https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE","7bf2279c8a65758319526a721d5c4b75683aec9c","skills\u002Fantigravity-feature-flags",3,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections","https:\u002F\u002Fgithub.com\u002Fboisenoise","2026-11-13 14:20:47",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add boisenoise\u002Fskills-collections --skill feature-flags",{"tool":66,"command":67},"bunx","bunx skills add boisenoise\u002Fskills-collections --skill feature-flags",{"tool":69,"command":70},"pnpm","pnpm dlx skills add boisenoise\u002Fskills-collections --skill feature-flags","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-feature-flags\u002FSKILL.md",true,[74],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fdetails.md","REFERENCE","参考文档",2394,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-feature-flags\u002Freferences\u002Fdetails.md",[81,106,134,160,179,202],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":85,"licenseFileUrl":86,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":40},"01M6WNH92BHVFXHGPDZCPJ0AG0","web-access","Use Treg for public web or platform data only when existing search, browser and connected tools cannot cover the task, with explicit cost and data boundaries.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FSKILL.md",[],[90,35,91,92,93,94,95,96,97,98,99,21,100,101,27,26,102,103,104,105,22],"web","web access","official","development","browser","search","data","Tools","read","fetch","youtube","free tools","free","cover","normal","when",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":85,"licenseFileUrl":110,"sourceHtmlUrl":111,"categories":112,"keywords":118,"publishedAt":40},"01M6WNF9XAYAB2CZDDJBAKNM93","treg","Use the Treg CLI or MCP catalog to discover, price and call authorized external tools with team-scoped credentials and a user-approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FSKILL.md",[113],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[108,119,120,121,92,93,122,97,123,124,125,126,127,128,129,26,130,131,132,133,22],"MCP","cli","github","license","Budget","credentials","team","catalog","use","call","discover","external tools","with","scoped","blob",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":85,"licenseFileUrl":138,"sourceHtmlUrl":139,"categories":140,"keywords":146,"publishedAt":40},"01M6WN93MEAZ4E41DYAHJRPHQT","recruit","Turn a job description into an evidence-linked candidate shortlist through Treg, with job-related ranking and optional authorized business contact enrichment.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FSKILL.md",[141],{"categoryNo":142,"categoryName":143,"taxonomyType":144,"taxonomyTypeDesc":145},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[136,121,92,122,147,148,149,150,151,152,26,153,154,155,131,156,157,158,159,133,108,22],"https","email","enrichment","business","evidence","phone","ranking","post","job description","for","person","candidate","reason",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":85,"licenseFileUrl":164,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":40},"01M6WN8R5RXSMHM9B4D9FAFX42","rea-growth","Analyze a company’s public growth and content through Treg, distinguish observations from hypotheses, and produce an evidence-linked playbook within an approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FSKILL.md",[],[168,169,170,121,92,122,171,172,147,173,123,174,175,176,151,26,177,178,133,108,22],"growth","rea","rea growth","produce","content","playbook","marketing","analyze","public","observations","company",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":85,"licenseFileUrl":183,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":40},"01M6WN2EVE3RQRGWAKBT4S7YT2","make-ugc","Create original AI UGC-style product videos through Treg: research hooks, approve a licensed presenter and voice, generate clips, add captions and report costs.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FSKILL.md",[],[187,188,121,189,92,190,122,191,192,193,194,195,26,196,197,198,199,200,201,133],"make","make ugc","research","create","Video","Captions","ads","short","hooks","head","style","niche","trending","talking-head","approve",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":85,"licenseFileUrl":206,"sourceHtmlUrl":207,"categories":208,"keywords":209,"publishedAt":40},"01M6WN10ARAA63Y8K1YNGXJ2RM","lead-signals","Find and qualify public buying signals through Treg, rank fitting business accounts and optionally enrich authorized business contact information.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FSKILL.md",[],[210,211,212,121,92,122,213,214,150,215,216,26,217,218,219,220,221,222,223,133],"signals","lead","lead signals","how","find","ready","as","how to","qualify","people","information","enrich","changes","funding"]