← Workflows

阅读中文版本

Feature Flag Cleanup Workflow

Retire flags that have been fully rolled out, remove dead branches, and prove the code still behaves the same.

beginner~45 minreleasefeature-flagcleanup

Objective

Remove shipped feature flags so conditional complexity does not accumulate indefinitely.

Environment

  • A flag management service
  • Code that reads the flags
  • Test coverage for both flag states

Steps

1. Inventory fully rolled out flags

List flags at 100 percent exposure for longer than the agreed soak period.

Expected state: A candidate list of removable flags exists.

2. Remove the off-path code

Delete the disabled branches and the flag reads, keeping the on-path behaviour.

Expected state: The flag no longer appears in code or configuration.

3. Delete the flag definition

Remove the flag from the management service once no code references it.

Expected state: The flag is gone from both code and service.

4. Verify behaviour is unchanged

Run the regression suite and compare key metrics after deployment.

Expected state: Tests pass and metrics show no behavioural drift.

Decision points

Delete the off path or keep it behind a flag?

  • Delete the off path
  • Keep both branches forever

Delete once fully rolled out; long-lived flags become technical debt.

Clean up per flag or in batches?

  • Small batches
  • One large cleanup

Clean in small batches so any regression is easy to bisect.

Expected outcome

Feature flags are retired after full rollout, reducing branching complexity without changing user-visible behaviour.

Verification

Confirm no code references the removed flag, tests pass, and production metrics match the pre-cleanup baseline.

Cleanup

Archive the flag history and note the removal in the release notes.

Overview

Remove shipped feature flags so conditional complexity does not accumulate indefinitely.

This workflow is reusable across teams and environments; adapt the commands to your tooling while keeping the sequence and checkpoints intact.

Environment and prerequisites

  • A flag management service
  • Code that reads the flags
  • Test coverage for both flag states

Procedure

1. Inventory fully rolled out flags

List flags at 100 percent exposure for longer than the agreed soak period.

Expected state: A candidate list of removable flags exists.

2. Remove the off-path code

Delete the disabled branches and the flag reads, keeping the on-path behaviour.

Expected state: The flag no longer appears in code or configuration.

3. Delete the flag definition

Remove the flag from the management service once no code references it.

Expected state: The flag is gone from both code and service.

4. Verify behaviour is unchanged

Run the regression suite and compare key metrics after deployment.

Expected state: Tests pass and metrics show no behavioural drift.

grep -rn 'FEATURE_NEW_CHECKOUT' src/ || echo 'flag fully removed'

Verification

Confirm no code references the removed flag, tests pass, and production metrics match the pre-cleanup baseline.

Decision points

Delete the off path or keep it behind a flag?

  • Delete the off path
  • Keep both branches forever

Recommendation: Delete once fully rolled out; long-lived flags become technical debt.

Clean up per flag or in batches?

  • Small batches
  • One large cleanup

Recommendation: Clean in small batches so any regression is easy to bisect.

Common failures

  • Removing the flag before full rollout causes unexpected behaviour changes.
  • Leaving orphaned flag definitions confuses operators.
  • A large batch cleanup makes regressions hard to bisect.