A store locks more merchandise after repeated theft events. The intervention is visible immediately: products are harder to access, associates are called more often, and customers wait. The loss-prevention question is whether the controls reduce shrink enough to justify the operational friction they create.
Share: Shrink controls can reduce loss and still create friction. Locked cases, staffing, false positives, wait time, safety, and conversion all belong in the same decision model. #Causality #RetailAnalytics #LossPrevention
Synthetic teaching model
This article uses a synthetic retail model. It is not pricing, legal, financial, operational, compliance, or merchandising advice. The sources below justify why some variables belong in the model. The probabilities are invented so the reasoning path is easy to inspect.
The Operating Problem Is Usually Wider Than The Metric
Retail security decisions are made under real pressure. Theft, fraud, and violence matter. So do false positives, associate safety, wait time, conversion abandonment, and customer experience. A control can be necessary and still poorly targeted.
Why The Dashboard Can Mislead
The dashboard can mislead if it reports shrink reduction without friction. A locked case may reduce loss and still lower sales if staffing is weak. A receipt check may deter theft and still raise false-positive or safety risk. The net question needs both sides.
Plain-language modeling note
A Bayesian belief network, or BBN, is a graph for asking conditional questions. Each node is a condition, each arrow says one condition informs another, and each probability is explicit. You do not need to know the SDK to read the graph: the SDK code is only there when we need a repeatable action query.
The Question For This Example
This example asks how net-loss-prevention-miss risk changes after observing high ORC signal, low associate coverage, broad locked cases, and poor camera analytics, and what changes if controls become targeted, staffing improves, and analytics quality improves.
The target outcome is NetLossPreventionMiss, which means net loss-prevention miss in this teaching model.
A Small Model Of The Situation
The model treats shrink control as a tradeoff between risk reduction and friction. It leaves out law enforcement, prosecution, exact shrink accounting, store layout detail, labor law, product category economics, and real incident records.
The graph has 15 nodes:
HighTheftCategory: High-theft category (no / yes)ORCSignal: ORC signal (low / high)AssociateCoverage: Associate coverage (adequate / low)LockedCasePolicy: Locked case policy (targeted / broad)ReceiptCheckIntensity: Receipt check intensity (targeted / high)SelfCheckoutControls: Self-checkout controls (strong / weak)CameraAnalyticsQuality: Camera analytics quality (good / poor)FalsePositiveRisk: False positive risk (low / high)ShopperAccessFriction: Shopper access friction (low / high)WaitTimeAtCase: Wait time at case (low / high)ConversionAbandonment: Conversion abandonment (low / high)EmployeeSafetyRisk: Employee safety risk (low / high)ShrinkReduction: Shrink reduction (adequate / low)CustomerExperienceDamage: Customer experience damage (low / high)NetLossPreventionMiss: Net loss-prevention miss (no / yes)

What Is Sourced And What Is Synthetic
NRF’s 2025 theft and violence study supports including theft, fraud, violence, ORC, technology, locked cases, and store-layout changes. NRF AI materials support cybersecurity, fraud prevention, accuracy, and regulatory complexity as retail AI considerations. Deloitte’s outlook supports physical-store experience and profitable transactions as practical constraints.
Theft, fraud, and violence- NRF reports continued retailer concern about theft, fraud, violence, and increasingly sophisticated organized retail crime.
Security measures- NRF notes measures such as cameras, lighting, license plate readers, locking cases, and layout changes.
Experience tradeoff- Deloitte’s retail outlook supports including in-store experience and profitability alongside operational controls.
Boundary of the evidence
The sources support the general mechanisms in the graph. They do not estimate this article’s node states, thresholds, or conditional probability values. Those are synthetic teaching values.
The Query The Graph Cannot Show By Itself
The visual graph is the best way to inspect the structure. The code-backed query is there for a narrower reason: we want to separate what is learned by observing a messy retail case from what changes if one condition is set differently.
Using the Darkstar Python SDK, a subscribed SDK user can load the same BBN JSON, ask for the target probability after evidence is entered, then run the action query by setting a node before querying again. The download includes this as illustrative SDK code, while the standalone query_example.py reproduces the article numbers without shipping the SDK.
import json
from darkstar import DiscreteModel
TARGET = "NetLossPreventionMiss"
OBSERVED_EVIDENCE = {
"ORCSignal": "high",
"AssociateCoverage": "low",
"LockedCasePolicy": "broad",
"CameraAnalyticsQuality": "poor"
}
INTERVENTION_CONTEXT = {
"ORCSignal": "high"
}
INTERVENTION = {
"LockedCasePolicy": "targeted",
"AssociateCoverage": "adequate",
"CameraAnalyticsQuality": "good"
}
def probability_after_observing(model, evidence):
query = {"nodes": [TARGET], "evidence": evidence}
result = json.loads(model.pquery(json.dumps(query)))
return result[TARGET]["yes"]
def probability_after_setting(model, setting, evidence):
changed_model = model.intervene(json.dumps(setting))
return probability_after_observing(changed_model, evidence)
with DiscreteModel(model_json) as model:
observed = probability_after_observing(model, OBSERVED_EVIDENCE)
acted = probability_after_setting(model, INTERVENTION, INTERVENTION_CONTEXT)
That is the article’s main modeling distinction. Observing a pattern is not the same as setting one part of the system differently.
The standalone query code gives this synthetic result:
Baseline net loss-prevention miss: 21.0%
Observed scenario (broad locks with low staffing and weak analytics): 27.7%
Action scenario (targeted controls with staffing and analytics): 21.3%
Same context with the action left unfavorable: 27.7%
Synthetic reduction versus the observed scenario: 6.5 percentage points
What We Learn By Observing The Situation
The observed scenario sets:
- ORC signal = high
- Associate coverage = low
- Locked case policy = broad
- Camera analytics quality = poor
The observed scenario raises net-loss-prevention-miss risk because broad locks are paired with low associate coverage and poor analytics. The model treats that as a high-friction, weakly targeted control posture.

What Changes If We Set One Condition Differently
The action scenario sets:
- Locked case policy = targeted
- Associate coverage = adequate
- Camera analytics quality = good
The action query makes controls targeted, improves associate coverage, and improves camera analytics. It does not assume theft risk disappears. It asks whether better targeting reduces the chance that controls miss the net business objective.
What This Example Cannot Prove
This model cannot recommend a security policy, estimate shrink, or assess legal risk. It is a teaching model for why loss prevention and customer friction should be reasoned about together.
Try this in the shared model
Open the companion model, change one upstream condition at a time, and watch the target probability move. Start with the observed scenario above, then reset one condition that looks actionable. The point is to compare stories, not to treat the toy probabilities as a forecast.
Try The Model
Open the companion Darkstar model: Open Retail Shrink Control Friction BBN
In the shared model, keep LockedCasePolicy broad but set AssociateCoverage adequate. Then make locks targeted while keeping staffing low. The comparison shows why policy and execution both matter.
Download the teaching package: Retail Shrink Control Friction BBN ZIP
The ZIP contains synthetic model and code only. It excludes incident records, store security data, video analytics, employee data, SDK binaries, and chart-generation code.

Leave a Reply