Prompt & Configuration Registry  ·  View 15 of 21  ·  Runtime

Experiment Assignment and Exposure

Assignment reads nothing, and that is the entire design.

Editable source SVG draw.io All views
Request Eligibility Assignment Serve Record Read out Resolver (in-process) resolve(key, unit) rule match hash(unit, salt) variant digest once per window Exclusion exclusion check holdout reserved holdout vs treated Control plane definition salt immutable weights live min exposures? Evidence exposure event drop count kept diff + interval loss rate stated Experiment Assignment and Exposure Assignment reads nothing. An empty cell in the Exclusion lane at Serve is deliberate: weights change, assignment does not. v 1.0 · owner Platform Architecture · d 2026-09

Decisions

  • Variant membership is hash(unit, salt) mod 100 against the declared weights. No store, no lookup, no assignment service, and therefore no assignment-service outage (ADR-09).
  • The same function is computable offline, so an analyst reconstructing an experiment from exposure data gets the same answer the resolver did.
  • Weights can be changed live; the salt cannot. Changing weights moves the boundary of the bucket range, which keeps already-assigned units where they are.

Assumptions

  • ≤ 0.1% of units may change variant over an experiment's life (stated assumption) — the budget for fleet changes and rounding, not for rebucketing.
  • 500 million exposure events/day at peak (stated assumption), which is why the exposure path is a droppable telemetry pipeline rather than a transactional write.

Open question, drawn

  • The Exclusion lane is thin because ownership of mutual exclusion is unresolved (ask.md Question 4). If prompt experiments must interact with pricing and UI experiments, this lane belongs to the organisation's experimentation platform and not to the registry.
  • The readout declares its loss rate rather than hiding it. An experiment that lost 4% of its exposures is a different claim from one that lost none.