CONCEPT Cited by 1 source
Register-based client capability matching¶
Definition¶
Register-based client capability matching is the
server-side mechanism that decides, per feature, whether the
requesting client can render that feature, by matching the
client's declared capabilities (platform, app version,
supported components and actions) against a list of
Register entries declared by the feature. The first
register whose Condition is satisfied wins; if none match,
the feature is omitted from the response.
This is how an SDUI system safely ships new components without breaking old app versions: the old client simply doesn't match any register that requires the new component, and the feature is dropped (or a fallback register picks a compatible variant).
The shape (per Yelp CHAOS)¶
Verbatim from the 2025-07-08 post: each register specifies
- Platform — "The platforms (e.g., iOS, Android, web) for which the registered configuration is intended."
- Elements — "The required components and actions in this configuration that the client must support. Internally, we maintain information about which components and actions supported by a given client platform type and app version, which is used for verification."
- Presenter Handler — "The associated handler (e.g., result_presenter) responsible for constructing the configuration if all conditions are met."
And the decision rule: "the presenter handler of the first qualifying register is selected to build the configuration. If no register qualifies, the feature is omitted from the final response."
Concretely in code (CHAOS):
Register(
condition=Condition(
platform=[Platform.IOS, Platform.ANDROID],
library=[TextV1, IllustrationV1, ButtonV1],
),
presenter_handler=self.result_presenter,
)
Multiple registers per feature encode fallbacks: the highest- priority (richest) variant is listed first; lower-priority variants with fewer required elements follow.
Why it's different from feature flags¶
| Feature flag | Register | |
|---|---|---|
| Scope | user / cohort / tenant | client capabilities |
| Typical gate | is this user in group X? | does this client support these components? |
| Failure mode | feature simply off | feature falls through to next register, or omitted |
| Placement in build | boolean check in application logic | first-class stage of the SDUI build pipeline |
The two compose — a feature flag can gate which register variant is advertised, while registers gate whether any variant is renderable for this client.
Why it's different from content negotiation¶
HTTP content negotiation (Accept headers, per
concepts/markdown-content-negotiation) is about picking
one representation of a single resource. Register-based
matching is about the inclusion / exclusion of a whole
feature in a composed page based on a vector of
capabilities (platform × version × element library). The two
solve adjacent problems; registers are the SDUI-specific
evolution.
Hard problems¶
- First-match is order-sensitive. Developers must list most-specific (richest) registers before fallbacks; a bug in ordering silently ships the wrong variant.
- Capability manifest is a source of truth. The backend needs an accurate mapping from (platform, app version) → (supported components, supported actions). Errors here are silent — a client gets a feature it can't render, or is incorrectly denied one.
- Register leakage across features. Features that share components often want to share register entries; the pattern offers no native composition mechanism.
- Tail app versions decay indefinitely. Long tail of very old app versions means many features permanently drop for them; teams need a policy on when to stop supporting old capabilities.
Seen in¶
- sources/2025-07-08-yelp-exploring-chaos-building-a-backend-for-server-driven-ui — Yelp's CHAOS framework; first wiki instance.