Skip to main content
A control point is a point of control over a release. Your application asks FireWeave for a typed value — boolean, string, number, or object — and uses that value to choose a path. OpenFeature and the wire still say flagKey. The product name is control point. Do not invent controlPointKey.

Why it exists

Operators reason about a release decision, not “a boolean in a flag console.” Evaluation is still a typed getter so call sites stay small and portable. The rename in the Node/Python/Web clients is additive: client.flags remains the same object as client.controlPoints and is not scheduled for removal in 2.x.

When to use it

Use a control point whenever your process must choose a value that FireWeave (or a test fixture) owns:
  • Gate a new code path (getBooleanValue / language equivalent)
  • Pick a string variant, numeric threshold, or JSON payload
  • Inspect a full Decision when you need reason or error fields
Do not use an in-app helper named fw.isOn. That symbol is not in the SDK.

How it relates

Missing targetingKey on a backend evaluate returns your default with TARGETING_KEY_MISSING (InvalidContext), unless you opt into requireTargetingKey. See Targeting.

Evaluation types by language

These are the types the SDKs actually implement. There is no cross-language int that every binding shares.
Go has no controlPoints namespace (Flags() only). Java has no controlPoints / flags facade. Do not copy Node method names onto those clients.

API

Evaluation never throws. Failures become a Decision (or a typed getter that returns your default) with reason: ERROR. If a flag getter raised, that is a bug.

Parameters (all languages)

Web evaluateSync does not take per-call sendExposure. Emission is a runtime config flag (sendExposure, default false).

Return value

  • Typed getters return the resolved value or your default.
  • evaluate / get_details / Flags().Evaluate return a Decision: flagKey, value (or your default), optional variant, reason, and error fields on failure.

Failure behavior

Full taxonomy: Errors.

The Decision

Every native evaluate produces a canonical Decision: Reasons you will see from this SDK: SPLIT is a Decision reason, not a ramp controller. The SDK does not advance percentages.

What it looks like

Namespace: client.controlPoints (alias client.flags — same object). Async.
OpenFeature providers exist in all five packages and use the same flagKey. See OpenFeature.
Last modified on August 18, 2026