-
Notifications
You must be signed in to change notification settings - Fork 1
docs: record feature flags substrate decision #5111
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
AceHack
merged 5 commits into
main
from
claim/task-b0786-feature-flags-doc-slice-20260526
May 26, 2026
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
7e5c95d
claim: task-b0786-feature-flags-doc-slice-20260526 - feature flags do…
c904d7a
docs: record feature flags substrate decision
6f15725
release: task-b0786-feature-flags-doc-slice-20260526 - docs slice ready
a0bf8bf
docs: trim feature flags ADR whitespace
06de718
docs: accept feature flags ADR
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
69 changes: 69 additions & 0 deletions
69
docs/DECISIONS/2026-05-26-feature-flags-substrate-openfeature-flipt.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,69 @@ | ||
| # ADR: Feature flags substrate uses OpenFeature as contract and Flipt first | ||
|
|
||
| **Status:** Accepted | ||
| **Date:** 2026-05-26 | ||
| **Backlog:** B-0786 | ||
| **Scope:** Decision substrate only; no implementation in this slice. | ||
|
|
||
| ## Context | ||
|
|
||
| B-0786 records the feature-flags substrate shape for the B-0776 | ||
| plugin sequence. The operator requirement is deliberately small: | ||
| open-source tooling, lowest operational overhead first, and a path | ||
| to add heavier backends only after the simple backend fails an | ||
| observed requirement. | ||
|
|
||
| The row also composes with namespace and experiment routing work: | ||
| operator-specific namespaces need flag values that do not perturb the | ||
| common namespace, and Argo Rollouts needs a stable way to ask whether | ||
| a rollout should proceed for a given operator context. | ||
|
|
||
| ## Decision | ||
|
|
||
| Use **OpenFeature** as the operator-facing feature-flag contract and | ||
| ship **Flipt** as the first backend. | ||
|
|
||
| The intended layering is: | ||
|
|
||
| | Layer | Choice | Reason | | ||
| |---|---|---| | ||
| | Operator API | OpenFeature SDK shape | Backend-agnostic contract; keeps application code stable when providers change | | ||
| | First backend | Flipt | Smallest open-source operating surface for the first implementation | | ||
| | Later backends | Unleash, Flagd, in-memory providers | Add only when a concrete requirement exceeds the Flipt shape | | ||
| | Routing composition | Namespace context plus experiment header | Lets operator branches vary flags without changing common namespace defaults | | ||
|
|
||
| The F# surface should expose a native provider interface and wrap the | ||
| OpenFeature provider model rather than binding callers directly to one | ||
| backend. Flipt is an implementation choice, not the operator contract. | ||
|
|
||
| ## Consequences | ||
|
|
||
| Positive: | ||
|
|
||
| - Operators get a standard feature-flag API while Zeta keeps backend | ||
| choice replaceable. | ||
| - The first implementation stays small enough for a P2 plugin slice. | ||
| - Namespace routing and progressive delivery can share one decision | ||
| surface instead of inventing separate toggle semantics. | ||
|
|
||
| Costs: | ||
|
|
||
| - Flipt-specific operational details still need an implementation row | ||
| before the plugin can ship. | ||
| - OpenFeature conformance tests become part of the eventual provider | ||
| contract, even though this slice does not add code. | ||
|
|
||
| ## Out Of Scope | ||
|
|
||
| - Implementing `Zeta.Feature.Flags`. | ||
| - Adding Flipt deployment manifests. | ||
| - Adding Argo Rollouts AnalysisTemplate examples. | ||
| - Choosing a second backend before Flipt fails an observed requirement. | ||
|
|
||
| ## Follow-Up | ||
|
|
||
| - Add `docs/plugins/zeta-feature-flags.md` with persona ontology maps | ||
| and rollout examples. | ||
| - Implement the F# provider interface and OpenFeature adapter in the | ||
| B-0776 plugin sequence. | ||
| - Add conformance tests that every future backend must pass. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.