title: Shadow Bouncer deployment description: Deploy Control Core in passive shadow mode for zero-risk compliance mapping before enforcement. audience: Platform engineers and compliance officers timeEstimate: 45 minutes prerequisites:
- Control Plane installed (Kickstart or Helm)
- At least one Bouncer registered in sandbox
Shadow Bouncer deployment
Updated guide: For the full shadow compliance lifecycle (Deploy → Fingerprint → Select → Observe → Report → Enforce), start at Shadow compliance discovery. This page remains the Bouncer-level reference for
BOUNCER_ENFORCEMENT_MODE=shadow.
Shadow mode lets you deploy standard Control Core with zero enforcement risk. The Bouncer evaluates every request through OPA (same Rego bundles as production), but always forwards traffic upstream. Decisions that would have been denied are recorded as SHADOW_WOULD_DENY audit events for compliance mapping in the Sovereign Compliance Dashboard.
Time estimate: 45 minutes for first shadow Bouncer + dashboard verification.
Online demo note: The public online demo at demoapp.controlcore.io runs Bouncers in enforce mode so live policy showcases work. Shadow mode is a customer sales/pilot capability — enable it only on dedicated customer installs via Helm (
values-shadow.yaml) or compose overrides.
What is Shadow Bouncer mode?
Shadow Bouncer mode is toggled by a single environment variable on the universal Bouncer image:
BOUNCER_ENFORCEMENT_MODE=shadow
| Mode | OPA evaluation | Traffic enforcement | Audit |
|---|---|---|---|
enforce (default) | Yes | Deny/mask per Rego | Standard decision logs |
shadow | Yes | Always allow upstream | SHADOW_WOULD_DENY when OPA would deny |
There is no separate product branch, forked image, or pilot-only Control Plane. Upgrade to enforcement is the same deployment with BOUNCER_ENFORCEMENT_MODE=enforce.
Why financial institutions use shadow mode
Canadian FIs often need evidence before inline enforcement:
- OSFI B-13 — technology and cyber risk visibility without blocking production APIs
- FINTRAC — map transaction and KYC field exposure against PCMLTFA controls
- PIPEDA / Bill C-27 — classify personal information fields before masking policies go live
Shadow mode produces audit-grade telemetry and gap analysis without changing application behavior.
Click to enlarge
Architecture overview
Click to enlarge
Key invariant: semantic classification runs in the Control Plane API (schema-time SSIE), not in Bouncer Go code. The Bouncer remains resource-agnostic.
Deployment models
Model A — Dedicated shadow Bouncer (recommended)
Deploy a sandbox Bouncer with BOUNCER_ENFORCEMENT_MODE=shadow. Point test clients or synthetic traffic at the shadow listener. Production traffic is unchanged.
Model B — Traffic mirror (Phase 2)
Use Envoy request mirroring to copy a percentage of live production traffic to a shadow Bouncer. Production path stays on the enforce Bouncer; mirror cluster receives a copy only.
Click to enlarge
See the traffic mirror cluster example shipped with your Helm chart (traffic-mirror-cluster.example.yaml) and the shadow values overlay (values-shadow.yaml).
Model C — Docker Compose (Kickstart)
Add to the Bouncer service environment in your compose override:
environment:
BOUNCER_ENFORCEMENT_MODE: shadow
Restart the Bouncer container — no rebuild required if using the standard image.
How to deploy (Helm)
Prerequisites: Helm chart from customer package; sandbox Bouncer enabled.
- Apply the shadow values overlay:
helm upgrade --install controlcore ./controlcore \
-f values.yaml \
-f values-shadow.yaml \
--set global.shadowPilot.enabled=true
- Confirm the Bouncer pod environment:
kubectl exec deploy/cc-bouncer-sandbox -- printenv BOUNCER_ENFORCEMENT_MODE
# Expected: shadow
-
In Control Plane Settings → Feature Flags, enable:
- Integrity pilot mode
- Sovereign compliance dashboard
- Shadow enforcement mode (Bouncer)
-
Open Compliance & Gaps in the sidebar (
/compliance).
Troubleshooting: If the compliance nav item is hidden, check effective feature flags at Settings → Feature Flags. See Troubleshooting.
How to deploy (Kickstart / Compose)
- Set
BOUNCER_ENFORCEMENT_MODE=shadowon the sandbox Bouncer service. - Restart:
docker compose restart cc-bouncer-sandbox(service name may vary). - Send authenticated traffic against a route with an activated deny control.
- Verify upstream returns success while Audit shows
SHADOW_WOULD_DENY.
Expected outcomes
After 24–48 hours of representative traffic:
| Surface | What you should see |
|---|---|
| Audit log | SHADOW_WOULD_DENY events with enforcement_mode=shadow |
| Compliance Dashboard — Telemetry | Would-deny stream by user, resource, action |
| Compliance Dashboard — Mapping | SSIE-inferred semantic tags vs regulation packs |
| Gap cache | Unclassified fields with remediation codes |
| Executive report | JSON mapped to OSFI B-13 / FINTRAC / PIPEDA sections |
Click to enlarge
SSIE and regulation packs
The Semantic Schema Inference Engine (SSIE) runs as a scheduled worker in the Control Plane API. It classifies resource schema fields (OpenAPI, inventory metadata) and publishes semantic tags through the Policy Bridge for OPA evaluation.
Regulation packs (YAML) map tags to frameworks:
- OSFI B-13
- FINTRAC PCMLTFA
- PIPEDA / Bill C-27
- PCI-DSS v4
Canadian control templates under canadian-financial-regulation/ consume these tags — they do not hardcode role names or remediation prose in Rego.
Trigger a manual SSIE cycle from the API:
curl -X POST "$PAP_API/v1/compliance/ssie/run" \
-H "Authorization: Bearer $TOKEN"
Upgrade path to enforcement
When gap analysis is acceptable:
- Run Policy Impact Simulator on critical deny paths.
- Change
BOUNCER_ENFORCEMENT_MODEtoenforceon a non-production Bouncer first. - Validate deny/mask behavior with test clients.
- Roll enforce mode to production Bouncers during a change window.
- Optionally disable Integrity pilot mode to show full enforcement UI surfaces.
Same image. Same Control Plane database. No migration to a different product SKU.
Click to enlarge
FAQ
Does shadow mode skip OPA?
No. OPA runs the identical query path. Only the enforcement of the decision changes (always allow upstream).
Can shadow mode accidentally block traffic?
No. The Bouncer startup path treats shadow as bypass on all deny branches. Request the procurement security pack from your Control Core account team for architecture evidence.
Does the Demo App need changes?
No. The sample application remains policy-blind. Compliance surfaces live only in the Control Plane UI.
Is SSIE reading live request bodies?
No. SSIE classifies schema-time metadata (discovery/inventory), aligned with the existing ERP classification worker pattern.
How do I mirror production traffic?
Enable bouncerSandbox.trafficMirror in values-shadow.yaml, mount traffic-mirror-cluster.example.yaml, and start with a low mirror percentage (e.g. 10%).
Where is the procurement security pack?
Request the procurement security pack from your Control Core account team — it includes an architecture one-pager, data flow diagram, SBOM reference, and startup assertion that shadow mode cannot deny traffic.
Verification checklist
-
BOUNCER_ENFORCEMENT_MODE=shadowon pilot Bouncer - Feature flags enabled for compliance dashboard
-
/complianceloads in Control Plane UI - Test request produces
SHADOW_WOULD_DENYin audit - Upstream API still returns 200 for would-deny path
- SSIE cycle completes (
POST /v1/compliance/ssie/run) - Gap cache shows at least one entry after schema discovery
- Executive report generates JSON