Markdown Editor

Configuration and Feature Flag Service Design Template

Dynamic config and feature flag service design: config as code, validation, targeting, sticky percentage rollout, host-agent fan-out, kill switches, audit

Thiết kế hệ thốngĐầy đủOpenFeature specification v0.9.0designconfigfeatureflagservice
Mở trong editorTải .md

Cách dùng: Use it when you build or replace the system that changes runtime behaviour without a deploy. Fill the split between local evaluation on servers and remote evaluation for clients (7.1) and the bucketing rule (7.2) first. The main pitfall is treating config changes as harmless: keep validation, staged rollout and automatic rollback in scope.

Xem trước

System Design: [Configuration and feature flag service name]

Reference design for a dynamic configuration and feature flag service: the system that lets engineers change runtime behaviour (flags, limits, thresholds, targeting rules) across thousands of servers and millions of client devices without a deploy. It covers configuration as code, validation, targeting rules, staged and percentage rollout, consistent bucketing, fan-out distribution and SDK caching, kill switches, audit and the consistency of evaluation. The SDK interface follows the concepts of the OpenFeature specification (release v0.9.0, July 2026; sections carry their own stability status). It follows the structure of the System Design Document template and is pre-filled with a worked design to adapt. Replace every [bracketed] value and every row marked Example; all numbers are illustrative assumptions, not benchmarks.

Document control

FieldValue
Document ID[SDD-CFG-001]
System / feature[Dynamic configuration and feature flags]
Version[0.1]
Status[Draft / In review / Approved / Implemented / Superseded]
Owner[@owner]
Author(s)[@author]
Reviewers[@reviewer-1], [@reviewer-2]
Last updatedYYYY-MM-DD
Classification[Internal]
Consumers in scope[Backend services, web app, iOS, Android, batch jobs]
SDK interface[OpenFeature-compatible providers / proprietary]
Related[Experimentation platform design], API Design Guidelines Template (architecture/api-design-guidelines), Release Checklist Template (dev/release-checklist)

Approvals

RoleNameDecisionDate
Tech lead, developer platform[@name][Approved / Changes requested]YYYY-MM-DD
Staff / principal engineer[@name][Decision]YYYY-MM-DD
SRE / operations[@name][Decision]YYYY-MM-DD
Security and privacy[@name][Decision]YYYY-MM-DD
Mobile platform[@name][Decision]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]First draft for design review
0.2YYYY-MM-DD[@name]Example: Moved client apps from local rule evaluation to remote evaluation to stop leaking targeting rules
0.3YYYY-MM-DD[@name]Example: Added automatic rollback on health regression during staged rollout
1.0YYYY-MM-DD[@name]Example: Approved

Contents

1. Overview

1.1 Problem statement

[Example: Teams use four different mechanisms for runtime switches: environment variables, a key-value store read on every request, a vendor SDK on mobile and hard-coded constants. A typo in a JSON value last quarter disabled checkout in one region for 47 minutes because nothing validated the change and it reached every server at once. Nobody can answer "what changed in the last hour" across systems, and 61% of flags have no owner.]

1.2 Proposed solution

[Example: One service stores all configuration and flag definitions as versioned, schema-validated objects in a repository. Every change goes through review, automated validation and a staged rollout that starts on a canary population and can roll back automatically. A distribution tier pushes changes to an agent on each host, which caches them on disk; server SDKs read from the local agent and evaluate rules in process. Browsers and mobile apps call a stateless evaluation endpoint that returns already evaluated values for the caller's context, so targeting rules never leave the server side. Percentage rollouts use deterministic hashing so a user stays in the same bucket as the percentage grows. Every change is audited and every flag has an owner and an expiry date.]

1.3 Decisions requested from reviewers

IDQuestionRecommended optionSection
Q-01Example: Push or poll for server distribution?Push through a host agent, with polling as a fallback7.1
Q-02Example: Evaluate on clients or on the server for mobile and web?Server-side remote evaluation for clients; local evaluation for servers7.1, 10
Q-03Example: How are percentage rollouts made sticky?Hash of flag salt and targeting key into 10,000 buckets7.2
Q-04Example: Do config changes roll out in stages like code?Yes, by default; emergency kill switches bypass bake time7.3
[Q-nn][Question][Option][Section]

1.4 45-minute interview path

MinutesCoverKey point to land
0 to 5Scope: flags and dynamic config, who consumes them (servers, clients)Servers and clients need different evaluation models
5 to 10Core requirements: propagation time, evaluation latency, safetyEvaluation must be local and never block a request
10 to 15Estimates: object count, subscribers, change rate, client polling rateFan-out, not storage, is the scaling problem
15 to 20Data model: flag, variant, rule, segment, version, auditImmutable versions make rollback trivial
20 to 25High-level diagram: authoring, validation, store, distribution, SDKsRead path never touches the authoring database
25 to 38One deep dive: distribution and propagation (7.1) is the classic; consistent bucketing (7.2) or safe rollout (7.3) are good alternativesBounded propagation time with no thundering herd
38 to 42Failure modes: bad config, distribution outage, SDK cold startLast-known-good on disk; defaults in code
42 to 45Trade-offs and what changes at 10xWhere the design breaks first

2. Requirements

2.1 Core functional requirements

IDRequirementPriority
FR-01Example: Define boolean, string, number and structured (JSON) flags with typed variantsMust
FR-02Example: Define dynamic configuration objects with a schema per namespaceMust
FR-03Example: Target by attributes (country, app version, plan), by named segment and by percentageMust
FR-04Example: Roll out changes in stages with health checks and automatic rollbackMust
FR-05Example: Kill switch: turn a feature off everywhere within 10 secondsMust
FR-06Example: Record who changed what, when and why, and show diffsMust
FR-07Example: Server SDKs for [Go, Java, Python, Node.js]; client SDKs for web, iOS and AndroidMust
FR-08Example: Report which variant each flag served (counts per flag and variant)Should
FR-09Example: Owner and expiry on every flag, with stale-flag reportsShould
[FR-nn][Requirement][Must / Should / Could]

2.2 Non-functional requirements

IDQualityTargetMeasured as
NFR-01Evaluation latency (server SDK)Example: p99 below 10 microseconds, no network callSDK benchmark
NFR-02Propagation time to serversExample: p99 below 30 s from approval; kill switch below 10 sCanary flag probe
NFR-03Read-path availabilityExample: Flag reads never fail; stale reads allowed during outagesChaos test with distribution down
NFR-04ConsistencyExample: Same user gets the same variant for the same flag version on every server and clientBucketing conformance test
NFR-05AuditabilityExample: 100% of changes attributed and retained for [7 years]Audit sampling
NFR-06Client privacyExample: Targeting rules and other users' attributes never shipped to clientsPayload review
[NFR-nn][Quality][Target][Measurement]

2.3 Below the line (out of scope)

  • [Example: experiment analysis and statistics (experimentation platform consumes exposure data from this service)]
  • [Example: secrets such as API keys and passwords (secret manager; this service must refuse values that look like secrets)]
  • [Example: infrastructure configuration such as Kubernetes manifests (GitOps pipeline)]
  • [Example: distribution of large binary artefacts such as ML models above 1 MB (artefact store; this service distributes a pointer and checksum)]

3. Capacity estimation

3.1 Assumptions

InputValueSource
Config objects and flagsExample: 60,000 objects, average 2 KBInventory
Server processes subscribingExample: 500,000 on 25,000 hosts (20 per host)Fleet inventory
Average share of processes subscribed to one namespaceExample: 5%Namespace analysis
Approved changesExample: 5,000 per day, peak 50 per minuteChange history
Concurrently active client devicesExample: 20 millionProduct analytics
Client refresh intervalExample: 300 s while in foregroundProduct decision
Flags evaluated per client refreshExample: 200Client flag inventory
Server requests per second (all services)Example: 2 million, 10 flag evaluations eachService metrics

3.2 Storage

60,000 objects x 2 KB = 120 MB for the full current state.

Consequence: the whole state fits in memory of the distribution tier, but not sensibly in every process; servers subscribe by namespace (Example: average 500 objects, about 1 MB per process).

3.3 Fan-out

One change reaches 5% of 500,000 processes = 25,000 processes. At 2 KB each that is 50 MB per change; at the peak of 50 changes per minute it is 2.5 GB per minute, about 42 MB/s.

Consequence: pushing from one origin to 500,000 processes is the problem. Push once per host to a local agent (25,000 agents, so 1,250 agents per change instead of 25,000 processes) through regional distribution proxies; processes read from the agent over a local socket or a memory-mapped file.

3.4 Client refresh rate

20 million devices / 300 s = about 66,700 requests/s. Each request evaluates 200 flags; at Example: 2 microseconds per evaluation that is 66,700 x 200 x 2 microseconds = 26.7 CPU seconds per second, about 27 cores.

Consequence: remote evaluation for clients is affordable (about 54 cores with 2x headroom across regions), so there is no need to ship rules to devices. Responses are personalised, so a CDN cannot cache them; instead the endpoint returns a hash of the evaluated result and clients send it back in a known_hash field, so an unchanged result returns a short "not modified" body. (Do not rely on If-None-Match here: on a POST, RFC 9110 answers a failed condition with 412, not 304.)

3.5 Server evaluations and exposure data

2 million requests/s x 10 evaluations = 20 million evaluations/s, all in process.

Consequence: evaluation CPU is negligible, but logging every evaluation is not (20 million events/s). SDKs aggregate counts per flag, variant and minute, and emit individual exposure events only for flags linked to an experiment.

3.6 Summary

QuantityEstimateDesign consequence
Total state120 MBNamespaced subscriptions
Fan-out per change25,000 processes, 1,250 hostsHost agent plus regional proxies
Client refreshabout 66,700 requests/sStateless evaluation service, result hash
Evaluations20 million/sIn-process evaluation; aggregated exposure counts
Audit5,000 changes per daySingle relational store, retained per NFR-05

4. API design

4.1 Interfaces

InterfaceOperationPurpose
Authoring APIPOST /v1/namespaces/{ns}/changesPropose a change (creates a reviewable change request)
Authoring APIPOST /v1/changes/{id}/approveApprove; starts the rollout plan
Authoring APIPOST /v1/flags/{key}/killKill switch: set the off variant everywhere, fast path
Authoring APIPOST /v1/changes/{id}/rollbackRoll back to the previous version
DistributionWATCH /v1/subscriptions (streaming)Agents receive versioned deltas for subscribed namespaces
Client evaluationPOST /v1/evaluateEvaluate all client-visible flags for a context
SDKgetBooleanValue(key, default, context) and typed variantsIn-process evaluation
SDKgetBooleanDetails(key, default, context)Value plus variant, reason and error code

4.2 SDK contract

Server SDKs expose an OpenFeature-style interface: an evaluation API with typed getters, an evaluation context (targeting key plus attributes), providers that implement the actual lookup, and hooks that run before and after evaluation. The detailed result carries the flag key, value, variant, reason and, when evaluation fails, an error code. Use the specification's reason values (for example STATIC, DEFAULT, TARGETING_MATCH, SPLIT, CACHED, DISABLED, STALE, ERROR) so dashboards can explain each result. The default value is always passed by the caller and returned on any error; evaluation never throws into application code.

// Example: server-side use through an OpenFeature-style client
ctx := openfeature.NewEvaluationContext("user-8d1f", map[string]any{
    "country": "DE", "plan": "pro", "app_version": "5.12.0",
})
details, _ := client.BooleanValueDetails(reqCtx, "checkout.new-tax-engine", false, ctx)
// details.Value, details.Variant, details.Reason (e.g. "SPLIT"), details.ErrorCode

4.3 Client evaluation request

POST /v1/evaluate HTTP/1.1
Content-Type: application/json

{"context": {"targetingKey": "user-8d1f", "platform": "ios", "app_version": "5.12.0", "country": "DE"}, "flags": ["*client"], "known_hash": "ev-3f9a"}

The response lists key, value and variant per flag, plus the snapshot version used, so a client can report which version it saw. The OpenFeature project also publishes a remote evaluation protocol (OFREP), defined in the open-feature/protocol repository and described in Appendix C of the specification; consider adopting it for this endpoint so standard client providers can call it.

4.4 Errors

Authoring API errors use Problem Details (RFC 9457). Validation failures return 422 with one entry per failed rule, so the author sees every problem at once.

5. Data model

5.1 Entities

Definitions are immutable once approved; a change creates a new version and a rollout that moves populations from the old version to the new one.

5.2 Storage choices

DataStoreWhy
Definitions, versions, changesGit repository as source of truth, mirrored to a relational database for queriesReview, diff and blame; transactional queries for the UI
Current snapshot per namespaceIn memory on distribution proxies, persisted in an object storeFast fan-out; cold start from object store
Host agent cacheLocal disk file plus memory mapProcesses start with last-known-good even when the network is down
Exposure countsEvent pipeline to the analytics storeHigh volume, append only
Audit logAppend-only table, replicatedCompliance retention

5.3 Access patterns

QueryServed byKey or indexPartition rationale
Evaluate flag X for context C (server)In-process snapshotFlag key hash mapNo partition: the namespace snapshot is small (Example: 1 MB)
Evaluate all client flags for context CEvaluation service memoryClient-visible flag listStateless service; snapshot replicated to every instance
Changes since version V for namespace NDistribution proxy(ns_id, version)Partition proxies by namespace hash so one hot namespace does not load all proxies
Who changed flag X in the last 24 hAudit table(flag_key, created_at)Single store; low volume
Flags past expiry, by ownerRelational mirror(owner, expires_on)Low volume
Which variant did user U seeExposure events for experiment flags(flag_key, targeting_key, time)Partition by flag key in the analytics store

6. High-level design

ComponentResponsibilityScales by
Authoring API and UIPropose, review, approve, kill, roll backLow traffic; one deployment
Validation and compileSchema checks, rule linting, conflict and reference checksCI workers
Rollout controllerAdvance stages, watch health, roll backOne active leader per region
Snapshot storeDurable compiled snapshots per namespace and versionObject store
Distribution proxiesHold snapshots, stream deltas to agentsShards by namespace hash
Host agentSubscribe once per host, write local cacheOne per host
Server SDKEvaluate locally from the agent's cacheWith each process
Client evaluation serviceEvaluate client flags per contextStateless instances

7. Detailed design

7.1 Deep dive 1: distribution and propagation

OptionPropagationLoad on originFailure behaviour
A. Every process polls a central APIPoll interval (for example 30 s)500,000 / 30 s = about 16,700 requests/s, mostly unchangedThundering herd after an outage
B. Every process holds a stream to the serviceSeconds500,000 open streamsReconnect storms
C. Host agent streams from regional proxies; processes read locallySeconds25,000 streams spread across proxiesAgent serves last-known-good from disk

Choice: C. Reason: it cuts the fan-out by the number of processes per host, removes the network from evaluation entirely and gives every host a durable cache. Agents also poll every Example: 5 minutes with the last version they hold, so a missed stream message is repaired without manual action. Reconnects use jittered exponential backoff.

The sequence for one approved change:

Large values (above Example: 1 MB) are not pushed inline: the snapshot holds a URL and checksum, and agents fetch the blob from the artefact store or from peers.

7.2 Deep dive 2: targeting and consistent bucketing

Rules are evaluated top to bottom; the first match wins:

  1. If the flag is killed, return the off variant (reason DISABLED).
  2. Individual targets (allow lists for testers).
  3. Segment and attribute rules (country in [DE, FR] and app_version >= 5.12.0).
  4. Percentage split for the remaining population.
  5. Default variant.
Option for percentage splitsSticky as percentage growsSame answer on every SDKVerdict
A. Random per evaluationNoNoNever for user-facing features
B. Stored assignment per userYesYes, with a lookupNeeds a database on the hot path
C. Deterministic hash of salt and targeting keyYesYes, if every SDK implements the same hashChosen

Choice: C. Reason: no storage and no network, and increasing a rollout from 10% to 20% keeps the first 10% in. Bucket rule:

bucket = hash32(flag.salt + "." + context.targetingKey) mod 10000
in_rollout = bucket < percentage * 100      # 25.5% -> bucket < 2550
  • Use one hash function across all SDKs (Example: MurmurHash3 32-bit) and publish conformance vectors so every language agrees.
  • Give each flag its own salt so the same users are not always first into every rollout; reuse a salt deliberately when two flags must align.
  • If the targeting key is missing, return the default with error code TARGETING_KEY_MISSING rather than bucketing on an empty string, which would put every anonymous user in one bucket.

7.3 Deep dive 3: safe change and kill switches

OptionSafetySpeedVerdict
A. Apply instantly everywhereLowFastestOnly for kill switches
B. Manual staged rolloutMediumSlow, depends on people watchingError-prone at night
C. Automated staged rollout with health gatesHighMinutesChosen as default

Choice: C, with A reserved for kill switches. Reason: the outage in 1.1 was a valid-looking change applied everywhere at once; staged exposure plus automatic rollback limits a bad change to the canary population.

Stages (Example): internal hosts, 1% of hosts in one region, one region, all regions. Each stage bakes for Example: 5 minutes. The controller compares error rate, latency and crash rate of hosts on the new version against hosts still on the old one and rolls back automatically on a regression above threshold.

Validation before any stage:

  • JSON schema per namespace (types, ranges, required fields).
  • Rule linting: unreachable rules, overlapping segments, percentage totals.
  • Reference checks: segments and variants that exist.
  • Secret scanning: reject values that look like credentials.
  • Optional custom validators owned by the consuming team, run in CI.

Kill switches are pre-declared off variants. A kill sets the flag version to "off" through a priority channel that skips bake time, is limited to users with the kill permission, and is always audited.

7.4 Deep dive 4: consistency of evaluation

ConcernRule
Within one requestThe SDK pins one snapshot per request (or per unit of work) so two reads of the same flag cannot disagree
Across flagsFlags in one namespace change atomically with the namespace version; cross-namespace atomicity is not promised, so dependent flags belong in one namespace
Across serversEventually consistent within the propagation target (NFR-02); version numbers in logs make skew visible
Across server and clientBoth use the same bucketing; the client sees the snapshot version that was current when it last refreshed
Monotonic versionsAgents and SDKs refuse a version lower than the one they hold, except when the rollback command explicitly asks

Choice: per-namespace snapshot versions with request-level pinning. Reason: global strong consistency would put a consensus round on every change and would not stop clients from holding stale values anyway; making staleness bounded and visible is enough for flags.

How real systems do it (paraphrased from Tang et al., "Holistic Configuration Management at Facebook", SOSP 2015; see 12.4). The paper describes a stack in which configuration is written as code, compiled and validated before it is committed, and stored in version control, so every change is reviewed and reversible. Changes are tested automatically on a small set of servers before wide release. A separate gating tool evaluates rollout and targeting rules inside the application, and mobile apps receive configuration through their own mechanism. Distribution is layered: a replicated store feeds proxies on each server, and large configurations travel through a hybrid of subscription and peer-to-peer transfer. The authors report that configuration errors were a major cause of incidents, which motivated treating config changes with the same rigour as code. Lesson for this design: invest first in validation, canary testing and per-host caching, not in a faster database.

7.5 Flag lifecycle

StateEntryExit
DraftCreated by ownerApproved
Rolling outStage 1 startedReached 100% or rolled back
Fully on or offStable for 14 daysCode cleanup removes references
Expiredexpires_on passedOwner extends with reason or removes
ArchivedNo references in code for 30 daysKept for audit only

A weekly report lists expired flags by owner; the code scanner flags references to archived keys in pull requests.

8. Scalability and performance

ConcernApproachLimit before redesign
Fan-outHost agents, proxies sharded by namespaceExample: about 5,000 agent streams per proxy instance
Snapshot size per namespaceSplit large namespaces; blobs by referenceExample: 5 MB per namespace before delta push latency grows
Client evaluationStateless, horizontally scaledEvaluation CPU, linear
Rule complexityCompile rules to predicates; cap rules per flagExample: 200 rules per flag
Change rateBatch changes per namespace into one version per secondExample: about 100 changes per minute per namespace

Propagation budget for a normal change (target p99 30 s after the stage starts):

StepBudget
Compile and write snapshot3 s
Proxy fan-out to agents5 s
Agent write and SDK swap1 s
Stream reconnect worst case for a lagging agent15 s
Headroom6 s

9. Reliability, security and operations

9.1 Failure modes

ComponentFailureDetectionBlast radiusMitigationRTO
Change contentValid-looking but harmful valueHealth gate in canary stageCanary populationAutomatic rollbackExample: 5 min
Authoring APIDownSynthetic probeNo new changes; kill switch unavailableBreak-glass CLI writes snapshot directly with auditExample: 15 min
Distribution proxiesShard downAgent stream errorsHosts on that shard stop receiving changesAgents fail over to another shard; serve last-known-goodExample: 1 min
Host agentCrashedAgent heartbeatProcesses on that hostSDK reads cache file directly; supervisor restarts agentExample: 30 s
Process cold start without cacheNo snapshot availableSDK reason DEFAULT, error PROVIDER_NOT_READYThat processCode defaults; bootstrap file in the imageExample: immediate (degraded)
Client evaluation serviceDownError rateClient appsClients keep last cached values; ship defaults in the appExample: 10 min
Bucketing bug in one SDKUsers see different variants per platformCross-SDK conformance test, variant mismatch metricUsers of that SDKPin SDK version; fix and publish vectorsRelease cycle
[Component][Failure][Signal][Scope][Mitigation][RTO]

9.2 Security and privacy

ThreatControl
Unauthorised change to a critical flagNamespace-level permissions; two-person approval for namespaces marked critical
Insider abuse of kill switchSeparate kill permission, audited, alert to namespace owners
Leaking targeting rules or segment membership to clientsRemote evaluation for clients; client responses carry only values and variants
Personal data in evaluation contextAllow-list of context attributes; hash or drop identifiers in exposure events
Secrets stored as configSecret scanning in validation; reject on match
Tampered snapshot in transitSigned snapshots verified by agents; TLS between tiers
[Threat][Control]

Review the privacy impact with the Privacy Threat Model Template (security/privacy-threat-model) when context attributes include personal data.

9.3 Observability

SignalSourceAlert threshold
Propagation lagCanary flag changed every minute, read back on sampled hostsExample: p99 above 30 s
Version skewActive version per namespace across agentsHosts more than 2 versions behind for 10 min
Evaluation errors by codeSDK hook countersExample: ERROR reason above 0.1% for a flag
Default-served rateSDK countersSudden rise after a change
Stale flagsWeekly lifecycle reportExpired flags per owner
Change-related incidentsIncident tagsReviewed monthly

9.4 Cost estimate

ItemUnit costQuantityMonthly cost
Distribution proxies[USD per instance-month]Example: 6 per region x 3[USD]
Client evaluation service[USD per core-month]Example: 54 cores across regions[USD]
Snapshot and audit storage[USD per GB-month]Example: under 50 GB[USD]
Exposure pipeline[USD per GB ingested][GB][USD]
Total[USD]

10. Trade-offs and alternatives

DecisionOptionsChosenWhyWhat we give up
Source of truthDatabase only; Git plus database mirrorGit plus mirrorReview, diff, blame, revertTwo stores to keep in sync
Server evaluationRemote call; localLocalNo network on the hot pathRules ship to servers (acceptable inside the trust boundary)
Client evaluationLocal rules on device; remoteRemoteRules and segments stay privatePer-request server cost; offline uses cached values
DistributionPoll; per-process stream; host agentHost agentFan-out reduced by processes per hostOne more daemon on every host
Rollout of configInstant; stagedStaged with kill-switch bypassLimits blast radiusNormal changes take minutes, not seconds
Build or buyVendor service; open-source; build[Decide][Reason][Cost]
What changes at 10x5 million processes, 200 million devicesSecond-level proxy tier, delta compression, regional evaluation clusters close to clientsProxy stream count and client QPS bind firstMore tiers to monitor
What changes at 0.1x50,000 processes, 2 million devicesDrop host agents; processes stream directly; a vendor or open-source flag service is likely cheaperTeam cost dominatesLess control over propagation and audit

11. Delivery plan and risks

11.1 Milestones

MilestoneScopeExit criterionTarget date
M1Authoring, validation, Git source of truth, server SDK for one languageTwo pilot services read flags locallyYYYY-MM-DD
M2Host agents and proxies in one region; staged rolloutPropagation p99 below 30 s for 14 daysYYYY-MM-DD
M3Client evaluation service, web and mobile SDKsConformance vectors pass on all SDKsYYYY-MM-DD
M4Migration of legacy mechanisms; lifecycle reportsLegacy key-value reads below 1%YYYY-MM-DD

11.2 Rollout and rollback

[Example: Migrate one namespace at a time. During migration the SDK provider reads both the old mechanism and the new service and logs mismatches; switch the provider to the new service once mismatches are zero for 7 days.]

11.3 Risks

IDRiskLikelihoodImpactMitigationOwner
R-01Example: Teams bypass the service with environment variablesMediumMediumGolden path templates; lint rule[@name]
R-02Example: Flag debt grows faster than cleanupHighMediumMandatory expiry; weekly report[@name]
R-03Example: SDK hash mismatch across languagesLowHighShared conformance vectors in CI[@name]
R-04Example: Specification changes in experimental OpenFeature sectionsMediumLowDepend only on stable or hardening sections; wrap experimental features[@name]
[R-nn][Risk][L / M / H][L / M / H][Mitigation][@name]

12. Appendices

12.1 Open questions

IDQuestionOwnerDue
OQ-01Example: Does the experimentation platform need per-user exposure events for all flags or only experiment flags?[@name]YYYY-MM-DD
OQ-02Example: Do mobile apps need offline evaluation of a subset of rules?[@name]YYYY-MM-DD
[OQ-nn][Question][@name]YYYY-MM-DD

12.2 Traceability

RequirementDesign sectionVerification
FR-03, NFR-047.2Bucketing conformance vectors on every SDK
FR-047.3Game day with a deliberately harmful value
FR-057.3Kill switch drill, measured end to end
NFR-027.1, 8Canary flag probe
NFR-039.1Chaos test with proxies and agents stopped
NFR-064.3, 9.2Payload review of client responses

12.3 Glossary

TermMeaning
FlagA named switch with typed variants and rules that select one
VariantOne possible value of a flag
Targeting keyThe stable identifier used for bucketing, usually a user or device ID
SegmentA reusable named set of targeting rules
Kill switchA pre-declared off variant applied everywhere through a fast path
SnapshotA compiled, versioned copy of a namespace's definitions
ProviderIn OpenFeature terms, the component that resolves flag values for the SDK

12.4 References

ReferenceUse
OpenFeature specification, release v0.9.0 (July 2026), openfeature.dev/specification; OpenFeature is a CNCF incubating projectSDK interface, evaluation details, reason and error codes (4.2)
OpenFeature Remote Evaluation Protocol (OFREP), defined in the open-feature/protocol repository (described in specification Appendix C)Option for the client evaluation endpoint (4.3)
C. Tang et al., "Holistic Configuration Management at Facebook", SOSP 2015, DOI 10.1145/2815400.2815401Inspiration for the box in 7.4 (paraphrased)
RFC 9457 Problem Details for HTTP APIsAuthoring API errors
Release Checklist Template (dev/release-checklist)Release gates that reference flags
API Design Guidelines Template (architecture/api-design-guidelines)Authoring API conventions
Notification Service System Design Template (system-design/design-notification-service)Pattern for fan-out to many devices

Standard and licence note

Based on the OpenFeature specification (release v0.9.0, sections with their own stability status) for the SDK interface and on RFC 9457 for errors. The Facebook paper is used as inspiration only and is paraphrased, not copied. All numbers are illustrative examples. Check the current version and section status of the specification at openfeature.dev before you implement. Original text written for this collection. Template licence: MIT.

Template liên quan