GitLab Feature Flags¶
This guide defines the BetterFleet Manage feature-flag process.
Purpose¶
- Align daily rollout practice with the intended feature-control model.
- Keep stage language, release communication, help-doc follow-through, and retirement expectations consistent.
- Make current usage explicit instead of relying on implied team knowledge.
Operating Model¶
- Runtime rollout state lives in GitLab Feature Flags and GitLab user lists.
- The Manage sysadmin feature-flag page is the operational view of stage and user access.
- The frontend still reads feature flags through Unleash.
- Local web development enables all flags by default unless
VITE_FEATURE_FLAGS_READ_FROM_UNLEASH=true. bf-manage-web/feature-flags.mdis the inventory of Manage flags.- Owner, rollout intent, release-note expectation, help-doc expectation, and retirement expectation must still be visible in the governed story, MR, or linked Linear work.
If the product behavior and this guide disagree, follow the product behavior and fix the guide.
Stage Language¶
Use this language in process conversations:
| Process term | Sysadmin label | Implementation rule | Meaning |
|---|---|---|---|
Internal |
Pre-Release |
Any flag that is not All Users and does not use a Beta user list |
limited rollout for internal or tightly controlled audiences |
Beta |
Beta |
At least one GitLab user list whose first word is Beta |
limited rollout for a named beta audience |
Fully Released |
Fully Released |
All Users strategy is present |
normal product behavior for everyone |
Additional rules:
enabledand stage are separate. A disabled flag is still off even if its derived stage isBetaorFully Released.- Beta detection is based on the first word of the user-list name being
Beta, case-insensitive. Use names likeBeta CustomersorBeta Feature X. Do not rely onbeta-*naming with punctuation and no space. Pre-Releaseis the sysadmin label for what the process should treat asInternal.
Working Process¶
- Define the flag before or with implementation.
- Choose a stable flag name.
- Record the intended audience, stage, owner, release-note expectation, help-doc expectation, and retirement expectation in the story, MR, or linked Linear work.
- Add the flag to
bf-manage-web/feature-flags.mdwhen it is a Manage flag in active use. - Deploy independently from rollout.
- Code may be deployed before the flag is broadly available.
- Do not use deployment alone as evidence that a feature is released.
- Set rollout using the GitLab conventions.
- Use explicit users or non-Beta user lists for
Internal. - Use Beta-named GitLab user lists for
Beta. - Use
All Usersonly when the feature should behave as standard product behavior. - Check the sysadmin page after rollout changes.
- Confirm the derived stage matches the intended stage.
- Confirm the expected users have or do not have access.
- Treat local development as a convenience, not rollout truth.
- If rollout-accurate local behavior matters, set
VITE_FEATURE_FLAGS_READ_FROM_UNLEASH=true. - Do not use local default all-flags-enabled behavior as release evidence.
Release Notes And Help Docs¶
- Feature-flagged work still follows the normal release-note and help-doc process.
Internal, shown in sysadmin asPre-Release, should usually stay inholdback.mdunless it is intentionally being communicated to internal or System Admin audiences now.Betawork may go tonext.public.md,next.internal.md, orholdback.mddepending on who should be told about it now.Fully Releasedwork should be treated as normal shipped behavior in release communication.- Update in-app help when flagged behavior changes what the intended current audience should see, expect, or do.
- Do not update general help as if a feature is broadly available while it is still
InternalorPre-Release.
Retirement¶
All Usersis the technical marker forFully Released. It is not the desired long-term resting state.- Moving a flag to
All Usersstarts retirement. - Record a retirement owner and due date in the story, MR, or linked execution issue.
- Remove the feature flag and stale conditional code in the next practical slice. Same-MR removal is preferred when easy, but it is not required.
- Do not leave permanent
All Usersflags in place without an active cleanup expectation. - Remove retired flags from
bf-manage-web/feature-flags.md.
References¶
- Manage inventory:
bf-manage-web/feature-flags.md - Release-note guide:
docs/process/guides/release-notes.md - In-app docs guide:
docs/process/guides/in-app-docs-authoring.md