Skip to content
Optimizer / Bandit guide
Bandit guide

How to use the bandit dashboard

Goal: understand which verified email angle to send per segment without letting unsafe claims win.

What is a multi-arm bandit in this project?

One decision tick
Segment: CFO CoreArm A sample: 24.1%Arm B sample: 18.8%
Selected: Arm AOutcome: meeting bookedLIE: Gate masked

A multi-armed bandit repeatedly chooses one action from a set and learns only from the action it chose. Here, an arm is an email angle, the context is the audience segment, and the reward is a booked meeting. Unlike a fixed A/B test, the traffic allocation changes after every observation.

Each tick samples one plausible CTR, \(\theta_i\), from every eligible arm's current posterior and selects \(\arg\max_i \theta_i\). This randomized policy naturally sends more traffic to strong arms while still testing uncertain ones. The Stanford Thompson Sampling tutorial provides the algorithmic background.

The Gate is a hard eligibility filter applied before optimization. Unsafe arms can remain visible for auditability but cannot enter the candidate set. Treat this like an allowlist boundary: policy decides what may compete; the bandit optimizes only inside that set.

Additional context
How to read this section: one decision tick works like a feature-flag service choosing a variant for one request. The values 24.1% and 18.8% are temporary random samples from each arm's current belief, not measured conversion rates. Arm A is selected because 24.1% is the larger sample. Only Arm A's outcome updates after the send.

For software engineers

Think of the bandit as a stateful request router. Its state is one posterior per segment and arm. For each request it filters ineligible arms, samples a score from each remaining posterior, routes to the highest sample, records the outcome, and updates only that arm.

The important difference from a normal load balancer is feedback: every routing result changes future routing probabilities.

For conversion administrators

Think of each arm as a campaign creative competing for the next send. Traffic is not split evenly forever. Copy that appears effective receives more opportunities, while uncertain copy still receives enough traffic to prove or disprove its potential.

The Gate ensures that conversion performance cannot promote claims that are not approved.

Intervention controls

Intervention controls
+ Inject candidate armPause simulationFast-forward 1,000 sendsReset memory
Pace: 300msLawful Gate Masking: ON

These controls mutate experiment state. Inject creates a new arm with a \(\operatorname{Beta}(1,1)\) prior, so it begins maximally uncertain and will receive exploratory traffic. Pause stops new observations without changing stored state. Fast-forward sends the current state to the backend, executes exactly 1,000 normal decision/update cycles, and applies the returned state atomically; it is a convergence test, not synthetic aggregation.

Pace changes only wall-clock timing, not the random process or posterior math. Reset is destructive to in-memory evidence: counters, posterior parameters, regret, and logs return to initialization. Gate masking changes the eligible action set before sampling; turning it off intentionally allows planted unsafe arms to compete.

Engineering check: after any intervention, distinguish policy changes from evidence changes. Pausing and pace changes preserve evidence; injection changes the arm set; reset deletes evidence; Gate masking changes eligibility.
Additional context
How to read this section: separate controls that change time from controls that change learning. Pause and pace change when ticks run. Inject changes which messages exist. Gate masking changes which messages are allowed to compete. Reset erases what the simulator has learned.

For software engineers

Classify each control by side effect. Pace and pause affect scheduling. Inject changes configuration and initializes state. Gate masking changes the selection predicate. Reset replaces all experiment state with defaults.

When debugging, log the control action and compare state before and after it. A timing control should never mutate posterior parameters.

For conversion administrators

Pause before investigating a surprising result so new sends do not move the numbers while you inspect them. Use fast-forward only to observe how the demo behaves with more traffic; it is not a substitute for real campaign evidence.

Adding a new message creates an unproven challenger. Expect early volatility while the system learns where it belongs.

Simulation traffic pulse

Production traffic
Outreach sends248
Meetings booked47
List burn1
Gate veto count69

Sends is the global denominator across all segments and arms. Meetings booked is the global positive-reward count; \(47/248 = 19.0\%\) is a useful aggregate health check, but it should not be used to rank arms because traffic is adaptively allocated and segments differ.

List burn counts unsubscribes. The alert rate is \(r_{\text{unsub}}=N_{\text{unsub}}/N_{\text{sends}}\), with a warning above \(0.50\%\). At the posterior level, an unsubscribe adds three \(\beta\) pseudo-counts, encoding that reputational harm costs more than an ordinary miss.

Gate veto count is an observability metric, not a denominator in CTR. It shows how often the demo exercised its safety boundary. A high count can mean the control is working under adversarial pressure; it does not by itself indicate degraded campaign performance.

Additional context
How to read this section: these four numbers summarize system activity, not which message is winning. In the example, 47 meetings from 248 sends gives a 19.0% aggregate result. One unsubscribe gives 0.40% list burn, below the 0.50% warning threshold. The 69 vetoes are blocked unsafe opportunities and are not included as sends.

For software engineers

These are service-level counters, not model parameters. Use them for monitoring and alerting. Arm-level sends and outcomes drive posterior updates; global totals summarize system throughput and harm.

A useful invariant is that global sends equal the sum of sends across all segments and arms.

For conversion administrators

Read meetings and unsubscribes together. A campaign with strong bookings but unacceptable list burn is not healthy. Also check absolute counts: one unsubscribe in a tiny sample can create a large temporary rate.

Gate vetoes show prevented risk, not lost conversions from approved copy.

Live belief curves and statistical confidence

Posterior chart excerpt
Arm A: narrow curve, mean 24%Arm B: wide curve, mean 15%
○ current Thompson sample◎ selected sample┊ simulated truth

Each curve is a Beta distribution: the bandit's current belief about one copy arm's true meeting-booking rate. The x-axis is possible CTR. The curve's shape tells you confidence.

  • Wide curve: not enough data yet. The arm may still be good or bad.
  • Tall narrow curve: enough evidence has accumulated. The model is more certain.
  • Curve shifted right: the arm is believed to have higher CTR.
  • Overlapping curves: no clear winner yet; exploration should continue.
  • Hollow circle: one Thompson sample drawn from that arm's curve for the current decision. The sample changes on every simulated send.
  • Circle with an outer ring: the winning sample. The bandit serves the arm whose sampled CTR is highest; the label above it explains whether that choice exploits the current leader or explores a challenger.
  • Truth and dashed line: the arm's fixed underlying CTR in this demo simulation. It generates the simulated outcomes and lets you compare the model's belief with reality. In a production experiment, this value is unknown and must be learned from observed results.

The y-axis is probability density, not probability. A taller peak does not mean a higher CTR; horizontal position indicates CTR, while narrowness indicates concentration. The NIST Beta distribution reference covers the density and shape parameters.

Stable winner

Angle A is narrow and right-shifted. Angle B is lower. Action: keep serving A, archive B only if it remains weak after enough sends.

Uncertain challenger

Angle B is wide and overlaps A. Action: do not archive yet. Let the bandit explore until the credible interval tightens.

Additional context
How to read this section: read each curve from left to right for expected performance and from wide to narrow for confidence. A curve centered near 24% says “values around 24% are plausible.” A wide curve says many other values are also plausible. The moving circle is one sampled value used for the current decision.

For software engineers

A curve is a serialized uncertainty state rendered as a density. The area under each curve is one; height alone is not a score. Horizontal position represents plausible CTR values, and width represents how uncertain the model remains.

The dashed truth line exists only because this is a simulator. Treat it like test-fixture data that production code would never receive.

For conversion administrators

Use the curve to answer two separate questions: “Where is this message likely to perform?” and “How sure are we?” A right-shifted but very wide curve may still be too uncertain for a campaign decision.

Do not archive a challenger merely because its current peak is lower when its range still overlaps the leader.

Exploit winner vs explore underdog

Decision mix
Exploit: 72%Explore: 28%

The meter classifies historical decisions, not a configured exploration rate. A pull is exploit when the sampled winner is also the arm with the highest posterior mean at that tick. It is explore when uncertainty gives another arm the highest random Thompson sample.

Thompson sampling has no fixed epsilon. Exploration emerges from posterior overlap: wide distributions occasionally produce high draws. As evidence accumulates, weak-arm distributions narrow and their chance of winning a draw falls.

Persistent exploration is not automatically a bug. It can indicate statistically similar arms, sparse traffic, a non-stationary reward process, or noisy outcomes. Investigate posterior overlap and segment quality before forcing exploitation.

Additional context
How to read this section: 72% exploit means 72 of every 100 historical decisions selected the arm that already had the highest estimated mean at that moment. The other 28 selected a challenger because its random sample was highest. This describes what happened; it is not a configured 72/28 traffic split.

For software engineers

There is no hard-coded exploration percentage. Random posterior samples implement the policy. As uncertainty contracts, the probability that a weak arm produces the maximum sample naturally decreases.

If exploration never declines, inspect reward ingestion, segment keys, posterior persistence, and whether resets are occurring unexpectedly.

For conversion administrators

Exploration is the cost of learning. It intentionally sends some traffic to copy that is not the current leader so the system can detect a better option.

A high explore share is acceptable early. Later, it should be explained by close-performing messages, limited data, or recent creative changes.

Candidate copy arms

Each card shows the operational and statistical state of a copy angle.

  • Claim tags: the evidence-backed claims the message relies on.
  • Belief \(\operatorname{Beta}(\alpha,\beta)\): \(\alpha\) grows with meetings; \(\beta\) grows with misses and more sharply with unsubscribes.
  • \(P(\text{Best})\): Monte Carlo estimate of how often this arm beats the others.
  • 95% credible interval: the plausible range for this arm's CTR based on current evidence.
  • Archive copy: removes the arm from future pulls without deleting its history.

Worked example

Start with the excerpt as an engineer would see it in the dashboard, then separate observed state from inferred state.

Angle A: ROI Proof roi_tco_cut \(P(\text{Best})=84.5\%\) Learned leader
We cut hospital Total Cost of Ownership by 22%...
Worth a 20-minute look?
Sends3
Clicks1
Belief\(\operatorname{Beta}(2,3)\)
Est. CTR40.0%
95% credible interval[6.7%, 80.3%]
\(\alpha_{\text{hits}}=2\)   \(\beta_{\text{misses}}=3\)
\(\theta_A\sim\operatorname{Beta}(\alpha=2,\beta=3)\)   \(N=3\)   archive: \(M_A=0\)

1. Separate copy metadata from experiment data

22%
A verified claim embedded in the email body. It is product evidence, not observed conversion data and not an input to the posterior update.
20 minutes
The proposed meeting duration in the CTA. It also has no statistical role.
3 sends
The number of times this arm was selected for the current segment. This is the arm-local sample count, also shown as \(N=3\).
1 click
One send produced the positive reward event. The UI says click, while the experiment interprets it as a booked-meeting success.

2. Reconstruct the posterior

The model starts each arm with a uniform \(\operatorname{Beta}(1,1)\) prior over its unknown conversion probability \(\theta_A\). Beta is conjugate to the Bernoulli likelihood, so ordinary binary outcomes update its two shape parameters as pseudo-counts:

\[ \alpha = 1 + N_{\text{success}} = 1 + 1 = 2, \qquad \beta = 1 + N_{\text{miss}} = 1 + 2 = 3 \] \[\theta_A\mid\mathcal{D}\sim\operatorname{Beta}(2,3)\]

The raw observed rate is \(1/3=33.3\%\). The displayed estimate is the posterior mean:

\[ \mathbb{E}[\theta_A\mid\mathcal{D}] = \frac{\alpha}{\alpha+\beta} = \frac{2}{2+3} = 40.0\% \]

The difference is prior smoothing. With only three observations, the two prior pseudo-counts still have substantial influence. As traffic grows, the likelihood dominates and the posterior mean approaches the empirical rate.

Implementation nuance: an unsubscribe applies \(\beta\leftarrow\beta+3\) instead of \(\beta\leftarrow\beta+1\). That is a deliberate utility penalty equivalent to three negative pseudo-observations. Once weighted outcomes are used, interpret \(\operatorname{Beta}(\alpha,\beta)\) as a decision model, not a literal posterior from only independent Bernoulli trials.

3. Read absolute uncertainty

\([6.7\%,80.3\%]\) approximates the central 95% posterior credible interval. The dashboard takes 1,000 samples from \(\operatorname{Beta}(2,3)\), sorts them, and uses draws near \(Q_{0.025}\) and \(Q_{0.975}\). Conditional on the model, roughly 95% of posterior probability lies between those bounds:

\[P\!\left(Q_{0.025}\leq\theta_A\leq Q_{0.975}\mid\mathcal{D}\right)\approx0.95\]

This is not a frequentist confidence interval and does not mean 95% of future clicks land in that range. It describes uncertainty about the single latent CTR parameter. The interval is extremely wide because three sends contain little information.

4. Read relative ranking

\(P(\text{Best}_A)=84.5\%\) answers a different question from estimated CTR. For each of 1,000 Monte Carlo rounds, the dashboard draws one \(\theta_i\) from every eligible arm and records which draw is largest. Angle A won about \(845/1000\) rounds.

\[P(\text{Best}_A)\approx P\!\left(\theta_A>\max_{j\neq A}\theta_j\right)\]

This probability depends on the competing arms and the current Gate/archive mask. It can change even if Angle A receives no new data, because another arm changed or left the pool. At \(\hat p=0.845\) and \(R=1000\) draws, the Monte Carlo standard error is approximately

\[\operatorname{SE}(\hat p)=\sqrt{\frac{\hat p(1-\hat p)}{R}}\approx 0.011\]

That is roughly 1.1 percentage points, so small refresh-to-refresh changes are simulation noise.

5. Read policy state

Learned leader
The eligible arm with the highest current \(P(\text{Best})\), not a declaration that learning is complete. Wide intervals can coexist with a leader when competitors are even less promising.
\(M_A=0\)
Archiving sets this arm's action mask to zero. Thompson sampling stops selecting it, but \(N\), \(\alpha\), \(\beta\), and historical outcomes remain intact for auditability or restoration.
Operational rule: use estimated CTR and its credible interval to assess one arm's absolute performance; use \(P(\text{Best})\) to compare the active pool; use sends and interval width to judge whether the ranking has enough evidence to act on.
Additional context
How to read this section: the card moves from facts to estimates. “3 sends” and “1 click” are observed facts. \(\operatorname{Beta}(2,3)\), 40.0% estimated CTR, the credible interval, and \(P(\text{Best})\) are computed from those facts plus the prior. Read the facts first so you know how much evidence supports the estimates.

For software engineers

The arm card combines three data domains: immutable creative metadata, mutable counters, and derived statistics. Debug them separately. A claim-tag problem is configuration; a send-count problem is event ingestion; a confidence problem is model computation.

Archiving should be reversible and must preserve historical state. It changes eligibility, not evidence.

For conversion administrators

Start with message identity and approved claims, then check volume, estimated CTR, uncertainty, and relative rank. Never treat the “Learned leader” label as automatic permission to launch broadly.

A decision-ready arm needs enough sends, acceptable list health, a credible advantage, and approved copy.

Real-time decision stream

Newest decision
CFO (Core Tier) 00:41:08
Copy Arm: A   Explore · sample 31.6%   Meeting booked

The feed is an append-only audit view displayed newest-first. Each row records the segment, selected arm, decision classification, sampled \(\theta_i\), timestamp, and observed outcome. The sampled percentage is the random Thompson draw that won this tick; it is not the arm's estimated CTR.

Follow one row through the state transition: selection increments sends; a meeting applies \(\alpha\leftarrow\alpha+1\); an ordinary miss applies \(\beta\leftarrow\beta+1\); an unsubscribe applies \(\beta\leftarrow\beta+3\). The dashboard then recomputes confidence and redraws the posterior for the affected segment.

Use the feed to explain discontinuities. If an arm's estimated CTR drops sharply, inspect recent outcomes rather than assuming a rendering defect. Repeated unsubscribes should produce a faster leftward update than repeated ordinary misses because of the weighted penalty.

Additional context
How to read this section: read one feed row as a cause-and-effect record. The example says the CFO Core segment received Arm A because its sampled value was 31.6%; the choice was classified as exploration; the recipient booked a meeting. That success increases Arm A's \(\alpha\) before the next decision.

For software engineers

Treat each feed row as an event in an event-sourced system: decision inputs, chosen action, outcome, and timestamp. Given the prior state and this event, you should be able to reconstruct the next posterior state.

The feed is capped at 50 rows, so it is a debugging window rather than a durable audit log. Production would persist these events outside the browser.

For conversion administrators

Use the feed to connect aggregate movement to individual sends. If list burn rises, look for which message and audience produced unsubscribes. If a challenger jumps in rank, look for a recent run of meetings.

One event is evidence, not a trend. Look for repeated outcomes before changing campaign policy.

Specialist diagnostics

Convergence diagnostics
Est. regret1.7
Policy entropy0.42
Avg KL div1.86
Active arm pool2

Interpret the example values

Est. regret
1.7
Plain meaning: across the simulation so far, exploratory choices cost about 1.7 expected meetings compared with an impossible oracle that always knew the best safe arm. This is a cumulative expected count, not 1.7% and not 1.7 observed lost meetings. How to judge it: regret normally increases because it accumulates. Watch how quickly it grows per additional send; a flattening curve means fewer costly choices.
Policy entropy
0.42
Plain meaning: the model has a preference, but meaningful uncertainty remains about which of the two active arms is best. With two arms, entropy ranges from \(0\) for a nearly certain leader to \(\log 2\approx0.693\) for a 50/50 ranking. The value 0.42 is about 61% of that maximum uncertainty. How to judge it: lower means a clearer ranking; it does not mean higher conversion performance.
Avg KL div
1.86
Plain meaning: on average, the active arms' beliefs have moved noticeably away from their original flat \(\operatorname{Beta}(1,1)\) priors. The unit is nats. There is no universal “good” cutoff for 1.86. How to judge it: compare it with earlier values from the same experiment and arm pool. Rising KL means the model is learning something, but that something may be that an arm performs poorly.
Active arm pool
2
Plain meaning: exactly two arms are currently eligible for selection after Gate masking and archiving. In this demo, that commonly means approved Arms A and B are competing while the planted lie is excluded. Why it matters: pool size changes the maximum possible entropy and the meaning of \(P(\text{Best})\). Compare entropy or ranking values only when you know which arms were active.
Combined reading: the system has learned substantially from its starting point (KL 1.86), currently leans toward one of two eligible arms but is not fully settled (entropy 0.42), and has paid about 1.7 expected meetings to explore. These values describe learning behavior. Check estimated CTR, credible intervals, meetings, and list burn before making a campaign decision.

Estimated regret accumulates the simulated opportunity cost of each choice:

\[R_T=\sum_{t=1}^{T}\max\!\left(0,\theta^*-\theta_{a_t}\right)\]

A value of \(R_T=1.7\) means 1.7 expected successes were forgone across the run. This is available only because the demo knows each arm's hidden truth, \(\theta_i\); production cannot compute true regret directly.

Policy entropy is computed over each active arm's \(P(\text{Best})\):

\[H(\mathbf p)=-\sum_{i=1}^{K}p_i\log p_i\]

It measures how diffuse the current ranking is. For two arms, entropy approaches \(0\) when one dominates and peaks at \(\log 2\approx0.693\) when both are equally likely to be best. Entropy depends on pool size, \(K\), so compare it only with the same eligible-arm count.

Average KL divergence measures how far each posterior has moved from its \(\operatorname{Beta}(1,1)\) prior, then averages across active arms:

\[D_{\mathrm{KL}}^{\mathrm{avg}}=K^{-1}\sum_{i=1}^{K}D_{\mathrm{KL}}\!\left(p_i(\theta)\,\|\,p_{0}(\theta)\right)\]

Higher means more belief change, not necessarily better performance. KL is asymmetric and measured in nats here. SciPy's entropy and relative-entropy reference gives the definitions.

Active arm pool is the count after archive and Gate masks. It is the denominator for competition and changes the interpretation of entropy and \(P(\text{Best})\).

Additional context
How to read this section: these diagnostics answer different questions. Regret asks “what did exploration cost in the simulator?” Entropy asks “how undecided is the policy?” KL divergence asks “how much has the model changed from its starting belief?” Active pool asks “how many messages are currently competing?” None of them is a conversion rate.

For software engineers

These metrics diagnose the learning process rather than campaign success. Regret requires simulator truth. Entropy summarizes routing uncertainty. KL divergence summarizes model movement from initialization. Pool size supplies the comparison context.

Alert on impossible combinations, not arbitrary values: for example, an active pool of zero means selection cannot proceed, while high KL with zero sends suggests corrupted state.

For conversion administrators

Use entropy to ask whether the system has a clear preference, not whether the campaign is good. Use KL to ask whether it has learned much, not whether performance improved.

A confidently learned poor result is still poor. Always pair diagnostics with estimated CTR, credible intervals, meetings, and list burn.

Head-to-head win probability matrix

Pairwise superiority P(row > column)
ArmAB
A78.4%
B21.6%

Each Monte Carlo round draws one plausible CTR from every active posterior. Cell \((A,B)=78.4\%\) estimates \(P(\theta_A>\theta_B)\): A's draw exceeded B's in roughly 784 of 1,000 rounds. With continuous Beta distributions, ties have probability zero, so

\[P(\theta_A>\theta_B)+P(\theta_B>\theta_A)=1\]

The diagonal is undefined because comparing an arm with itself has no decision value. This matrix answers pairwise superiority, while \(P(\text{Best})\) asks whether an arm beats all competitors simultaneously. With three or more arms, \(P(\theta_A>\theta_B)\) can be high while A's \(P(\text{Best})\) remains modest because arm C often wins.

Treat 70% highlighting as a dashboard heuristic, not a universal statistical threshold. Use the interval width, business cost, and sample volume when deciding whether the evidence is actionable.

Additional context
How to read this section: choose a row, then read across. The A-to-B cell at 78.4% means a plausible CTR sampled for A exceeded a plausible CTR sampled for B in about 784 of 1,000 comparisons. The reverse cell is 21.6%. This compares uncertainty-aware possibilities, not just the two displayed means.

For software engineers

The matrix is computed from the same 1,000 synchronized Monte Carlo rounds used for ranking. For every draw, compare each ordered pair and increment the corresponding cell.

Useful invariants: the diagonal is empty, every off-diagonal value lies in \([0,1]\), and opposite cells sum to approximately one.

For conversion administrators

Read across a row as “How often does this message beat each alternative?” A green cell means directional evidence, not guaranteed future performance.

Use pairwise comparisons when deciding between two specific creatives. Use \(P(\text{Best})\) when deciding which creative leads the entire active set.

Posterior parameter table

Posterior parameter estimation
ArmMeanModeVarianceKL div
Angle A40.00%33.33%0.040000.235
Angle B20.00%0.00%0.026670.636

Interpret the example values

Mean
A: 40.00%
B: 20.00%
Plain meaning: the model's current average estimate for A is twice B's estimate. This makes A the stronger candidate on expected CTR. Action: allow A to receive more traffic, but do not promote or archive from the means alone. These estimates may still be based on very few sends, and their credible intervals may overlap substantially.
Mode
A: 33.33%
B: 0.00%
Plain meaning: A's belief curve peaks near 33.33%. B's curve peaks at the zero boundary, usually because B has no recorded successes yet and its posterior is strongly right-skewed. Action: do not read B's 0.00% mode as “B can never convert.” Its 20.00% mean shows that non-zero CTR values remain plausible. Use the full interval and additional sends before eliminating it.
Variance
A: 0.04000
B: 0.02667
Plain meaning: variance measures uncertainty in probability-squared units, so it is not a percentage. The easier interpretation is standard deviation: \(\sqrt{0.04000}=0.20\) for A and \(\sqrt{0.02667}\approx0.163\) for B. Both beliefs are still broad. B's lower variance does not make B better; it means B is somewhat more concentrated around its lower estimate. Action: collect more evidence rather than treating either point estimate as stable.
KL divergence
A: 0.235
B: 0.636
Plain meaning: B has moved farther from the original flat prior than A. That does not mean B is performing better. In this example, the model has learned more strongly that B is likely weak. Action: use KL to judge how much learning occurred, then use mean, credible interval, and business outcomes to judge whether that learning is favorable.
Combined reading: A currently looks more promising, but both arms remain uncertain. Keep A favored and continue collecting evidence. Keep B eligible if its credible interval still overlaps A or its sample size is small. Consider archiving B only when it has adequate traffic, persistently lower estimates, a low \(P(\text{Best})\), and no strategic reason to continue testing it.

Turn the table into an action

  1. Check volume first: confirm sends and outcomes are large enough to support interpretation. Sparse rows produce unstable means and boundary modes.
  2. Use mean for direction: identify which arm currently has the higher expected CTR.
  3. Use variance and the credible interval for confidence: determine whether the apparent gap is stable or still dominated by uncertainty.
  4. Use \(P(\text{Best})\) and the win matrix for comparison: verify that the preferred arm usually beats the alternatives across posterior draws.
  5. Check business constraints: review unsubscribes, approved claims, audience fit, and the cost of sending weak copy.
  6. Choose the least destructive action: continue learning when evidence is weak, favor the leader when evidence is directional, and archive only when evidence and business context agree.

Mean is the expected CTR under the posterior and the estimate used to identify the current mean leader. Mode is the peak location when both parameters exceed one:

\[ \mathbb{E}[\theta]=\frac{\alpha}{\alpha+\beta}, \qquad \operatorname{mode}(\theta)=\frac{\alpha-1}{\alpha+\beta-2} \]

Mean and mode differ for skewed distributions.

Variance measures posterior spread:

\[\operatorname{Var}(\theta)=\frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}\]

Lower variance means the posterior is more concentrated, but compare variance alongside the mean because probabilities near zero or one naturally have different scale.

KL divergence quantifies information gained relative to the uniform prior. It does not encode direction: a confidently poor arm can have higher KL than a promising but uncertain arm. The table is the numeric representation of the same distributions drawn in the belief chart.

Additional context
How to read this section: mean is the average of the whole belief curve; mode is the curve's highest point; variance is how spread out the curve is; KL divergence is how different the curve is from the original flat prior. For Angle A, mean 40.0% and mode 33.3% differ because the distribution is skewed rather than symmetric.

For software engineers

This table is a deterministic projection of \(\alpha\) and \(\beta\). Mean, mode, and variance should be reproducible from those two parameters. KL should be reproducible from the posterior and the configured prior.

When the chart and table disagree, verify that both use the same segment, active-arm filter, and posterior snapshot.

For conversion administrators

Mean is the easiest planning estimate. Mode is the single most likely point, but can be unstable with little data. Variance tells you how cautiously to interpret either point.

Prefer a slightly lower estimate with tight uncertainty over a dramatic estimate supported by only a few sends when making a high-cost rollout decision.

Posterior drift log

Specialist posterior drift log
[00:41:08] CFO Core: Arm A pulled. KL: 0.24, Est CTR: 40.0%, P(Best): 84.5%
[00:41:05] CFO Core: Arm B pulled. KL: 0.64, Est CTR: 20.0%, P(Best): 15.5%

Each entry is a compact state snapshot after a pull: timestamp, segment, arm, KL divergence, updated posterior mean, and \(P(\text{Best})\). Read adjacent entries as transitions, not independent events.

One success increments \(\alpha\), usually moving the mean right. One miss increments \(\beta\), moving it left. Either outcome generally reduces \(\operatorname{Var}(\theta)\) as effective evidence increases. An unsubscribe increments \(\beta\) by three, so both the mean and \(D_{\mathrm{KL}}\) can move more sharply.

\(P(\text{Best})\) may move even when the displayed arm was not selected because all arms are re-compared after relevant segment updates. The log retains only the newest 50 entries, so it is an operational debugging buffer rather than durable experiment storage.

Additional context
How to read this section: compare successive rows for the same segment and arm. If estimated CTR moves from 25% to 33.3% after a meeting, the log confirms the update direction. If \(P(\text{Best})\) moves slightly without new evidence for that arm, the change may come from another arm or Monte Carlo randomness.

For software engineers

Use the drift log to verify update ordering: record outcome, mutate posterior, recompute derived statistics, then render. Logging before recomputation produces stale P(Best) values and confusing traces.

Because Monte Carlo estimates are random, repeated computations on unchanged state can differ slightly. Large changes should correspond to evidence or eligibility changes.

For conversion administrators

The log explains why a number moved. A meeting should generally improve that arm's estimated CTR; a miss should reduce it; an unsubscribe should reduce it more sharply.

Small P(Best) changes can be simulation noise. Focus on sustained direction and the outcomes that caused it.

Scenario examples and actions

Operator triage excerpt
SRE health normalA: P(Best) 91%Entropy 0.30
Alternate state: list burn 0.81%Gate mask active

Scenarios combine several signals. Avoid making operational decisions from one KPI: first confirm eligibility, then inspect outcome quality, posterior uncertainty, and convergence.

Scenario 1: CFO ROI proof is clearly winning

Evidence: high \(P(\text{Best})\), a narrow credible interval, low entropy, and mostly exploit pulls. Action: keep it active and consider archiving weak challengers only after checking their send counts. Promotion still requires copy and claim review; statistical rank does not validate message truth.

Scenario 2: Transparent pricing has few sends and a wide interval

Evidence: lower posterior mean, low N, and substantial interval overlap. Action: do not archive based on point estimate alone. Continue normal exploration or fast-forward the demo, then reassess whether uncertainty actually contracts.

Scenario 3: Planted lie has the highest latent CTR

Evidence: the unsafe arm's simulated truth is high, but it is marked Gate-vetoed and absent from sampling. Action: keep masking enabled. This demonstrates separation of concerns: evidence policy controls eligibility, while the optimizer controls allocation.

Scenario 4: List burn spikes

Evidence: global unsubscribe rate exceeds 0.50%, with recent unsubscribe outcomes concentrated in the feed. Action: pause, identify the contributing segment and arm, inspect absolute counts as well as rate, then archive the arm if the harm is concentrated. A one-event spike at tiny N needs different treatment from sustained burn.

Scenario 5: Entropy remains high after many sends

Evidence: \(P(\text{Best})\) remains diffuse and posterior curves overlap despite substantial traffic. Action: check reward latency, non-stationarity, broad segments, and near-identical arms. More traffic does not fix a misspecified reward or mixed population; consider splitting the segment or redesigning the challenger.

Additional context
How to read this section: each scenario follows the same sequence: identify the signal, check whether enough evidence supports it, inspect safety and business constraints, then choose an action. The examples are decision templates, not automatic rules. A high \(P(\text{Best})\) can justify more traffic only when claims are approved and list health remains acceptable.

For software engineers

Use a fixed triage order: validate event ingestion, validate segment and arm keys, confirm Gate/archive masks, reconstruct posterior updates, then inspect Monte Carlo output. This separates data defects from expected statistical uncertainty.

Capture the state snapshot before applying a corrective action so the behavior is reproducible.

For conversion administrators

Use a fixed decision order: confirm the copy is eligible, check list health, check sample size and uncertainty, compare alternatives, then decide whether to continue, pause, archive, or promote.

Document both the evidence and the business threshold behind the action. “Highest CTR” alone is not a complete campaign decision.