{
  "code": null,
  "collection": "architecture",
  "href": "https://banes-lab.com/ontology#architecture-feature-toggle",
  "id": "feature-toggle",
  "kind": "mechanism",
  "layer": {
    "href": "https://banes-lab.com/ontology/schema#layer-extensibility-core",
    "json": "https://banes-lab.com/json/records/layer/extensibility-core",
    "label": "Extensibility Core",
    "markdown": "https://banes-lab.com/records/layer/extensibility-core.md",
    "ref": "layer:extensibility-core"
  },
  "name": "Feature Toggle",
  "ref": "architecture:feature-toggle",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-externalized-flag-state",
          "json": "https://banes-lab.com/json/records/lexicon/externalized-flag-state",
          "label": "Externalized Flag State",
          "markdown": "https://banes-lab.com/records/lexicon/externalized-flag-state.md",
          "ref": "lexicon:externalized-flag-state"
        }
      ],
      "relation": "requires"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-continuous-delivery",
          "json": "https://banes-lab.com/json/records/lexicon/continuous-delivery",
          "label": "Continuous Delivery",
          "markdown": "https://banes-lab.com/records/lexicon/continuous-delivery.md",
          "ref": "lexicon:continuous-delivery"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-runtime-extensibility",
          "json": "https://banes-lab.com/json/records/architecture/runtime-extensibility",
          "label": "Runtime Extensibility",
          "markdown": "https://banes-lab.com/records/architecture/runtime-extensibility.md",
          "ref": "architecture:runtime-extensibility"
        }
      ],
      "relation": "reinforces"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-decoupled-deploy-and-release",
          "json": "https://banes-lab.com/json/records/lexicon/decoupled-deploy-and-release",
          "label": "Decoupled Deploy and Release",
          "markdown": "https://banes-lab.com/records/lexicon/decoupled-deploy-and-release.md",
          "ref": "lexicon:decoupled-deploy-and-release"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-gradual-rollout",
          "json": "https://banes-lab.com/json/records/lexicon/gradual-rollout",
          "label": "Gradual Rollout",
          "markdown": "https://banes-lab.com/records/lexicon/gradual-rollout.md",
          "ref": "lexicon:gradual-rollout"
        }
      ],
      "relation": "enables"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-hardcoded-branch-constant",
          "json": "https://banes-lab.com/json/records/lexicon/hardcoded-branch-constant",
          "label": "Hardcoded Branch Constant",
          "markdown": "https://banes-lab.com/records/lexicon/hardcoded-branch-constant.md",
          "ref": "lexicon:hardcoded-branch-constant"
        }
      ],
      "relation": "conflicts-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-flag-debt",
          "json": "https://banes-lab.com/json/records/lexicon/flag-debt",
          "label": "Flag Debt",
          "markdown": "https://banes-lab.com/records/lexicon/flag-debt.md",
          "ref": "lexicon:flag-debt"
        }
      ],
      "relation": "tensions-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#tension-feature-toggle-flag-debt",
          "json": "https://banes-lab.com/json/records/tension/feature-toggle-flag-debt",
          "label": "Feature Toggle / Flag Debt",
          "markdown": "https://banes-lab.com/records/tension/feature-toggle-flag-debt.md",
          "ref": "tension:feature-toggle-flag-debt"
        }
      ],
      "relation": "tensions"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-hardcoded-branch-constant",
          "json": "https://banes-lab.com/json/records/lexicon/hardcoded-branch-constant",
          "label": "Hardcoded Branch Constant",
          "markdown": "https://banes-lab.com/records/lexicon/hardcoded-branch-constant.md",
          "ref": "lexicon:hardcoded-branch-constant"
        }
      ],
      "relation": "violated-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#vocabulary-severity-contextual",
          "json": "https://banes-lab.com/json/records/vocabulary/severity-contextual",
          "label": "contextual",
          "markdown": "https://banes-lab.com/records/vocabulary/severity-contextual.md",
          "ref": "vocabulary:severity-contextual"
        }
      ],
      "relation": "severity"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-plugin-extensibility-ioc",
          "json": "https://banes-lab.com/json/records/architecture-category/plugin-extensibility-ioc",
          "label": "Plugin / Extensibility / IoC",
          "markdown": "https://banes-lab.com/records/architecture-category/plugin-extensibility-ioc.md",
          "ref": "architecture-category:plugin-extensibility-ioc"
        }
      ],
      "relation": "category"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-big-bang-release",
          "json": "https://banes-lab.com/json/records/architecture/big-bang-release",
          "label": "Big-Bang Release",
          "markdown": "https://banes-lab.com/records/architecture/big-bang-release.md",
          "ref": "architecture:big-bang-release"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-attack-surface-reduction",
          "json": "https://banes-lab.com/json/records/architecture/attack-surface-reduction",
          "label": "Attack Surface Reduction",
          "markdown": "https://banes-lab.com/records/architecture/attack-surface-reduction.md",
          "ref": "architecture:attack-surface-reduction"
        }
      ],
      "relation": "refactors"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/software-architecture#a-system-is-a-graph",
          "json": "https://banes-lab.com/json/software-architecture/model/a-system-is-a-graph",
          "label": "A system is a graph",
          "markdown": "https://banes-lab.com/software-architecture/model/a-system-is-a-graph.md",
          "ref": "chapter:/software-architecture#a-system-is-a-graph"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-anti-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-anti-patterns",
          "label": "Anti-patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-anti-patterns.md",
          "ref": "chapter:/ontology#architecture-category-anti-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-runtime-discovery-dynamic-binding",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-runtime-discovery-dynamic-binding",
          "label": "Runtime Discovery / Dynamic Binding",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md",
          "ref": "chapter:/ontology#architecture-category-runtime-discovery-dynamic-binding"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-security-privacy-compliance-governance",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-security-privacy-compliance-governance",
          "label": "Security / Privacy / Compliance / Governance",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-security-privacy-compliance-governance.md",
          "ref": "chapter:/ontology#architecture-category-security-privacy-compliance-governance"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-plugin-extensibility-ioc",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-plugin-extensibility-ioc",
          "label": "Plugin / Extensibility / IoC",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-plugin-extensibility-ioc.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-plugin-extensibility-ioc"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-vocabulary-severity",
          "json": "https://banes-lab.com/json/ontology/schema/the-vocabulary-severity",
          "label": "Severity levels",
          "markdown": "https://banes-lab.com/ontology/schema/the-vocabulary-severity.md",
          "ref": "chapter:/ontology/schema#the-vocabulary-severity"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-resolutions",
          "json": "https://banes-lab.com/json/ontology/schema/the-resolutions",
          "label": "The resolutions",
          "markdown": "https://banes-lab.com/ontology/schema/the-resolutions.md",
          "ref": "chapter:/ontology/schema#the-resolutions"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "summary": "A mechanism that switches a code path on or off at runtime from externally held flag state, so a release can happen without a deploy.",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/ontology#architecture-self-healing-architecture",
      "json": "https://banes-lab.com/json/records/architecture/self-healing-architecture",
      "label": "Self-Healing Architecture",
      "markdown": "https://banes-lab.com/records/architecture/self-healing-architecture.md",
      "ref": "architecture:self-healing-architecture"
    },
    "previous": {
      "href": "https://banes-lab.com/ontology#architecture-service-locator-pattern",
      "json": "https://banes-lab.com/json/records/architecture/service-locator-pattern",
      "label": "Service Locator Pattern",
      "markdown": "https://banes-lab.com/records/architecture/service-locator-pattern.md",
      "ref": "architecture:service-locator-pattern"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/records/architecture",
    "label": "Architecture principles",
    "markdown": "https://banes-lab.com/api/records/architecture.md",
    "ref": "api:records/architecture"
  },
  "aliases": [
    "Feature Flag"
  ],
  "exemplar": {
    "after": "if (featureFlags.enabled(\"new-foo-flow\", { user, percentage: 10 })) runNewFooFlow();\nelse runOldFooFlow();",
    "before": "if (NEW_FOO_FLOW_ENABLED) runNewFooFlow();\nelse runOldFooFlow();",
    "lang": "ts",
    "medium": "code"
  },
  "formedBy": null,
  "scope": [
    "application",
    "release",
    "runtime"
  ],
  "severity": "contextual"
}
