SSM-Audit – Case Study C: FX & Inflation Hide Margin Erosion (4.1C)

Scope (anonymized). Multi-currency, inflationary environment with respectable gross margins on paper. We keep classical values identical (phi((m,a)) = m) and surface margin fragility via bounded lanes on margin stability, price realization, and collections schedule. No third-party data is embedded here; full, stampable artifacts are available via the repository link below.

What we show (executive view).

  • Margins look fine, stability slides: composite lane drifts A+ → A0 → A- while reported gross margin m remains “healthy.”
  • Pass-through lag is visible: lane on price realization vs. reference weakens first; collections schedule follows.
  • Deterministic & portfolio-ready: fixed knobs, batch == stream, and a one-look composite for boards.

Invariants (non-negotiable).

collapse:   phi((m,a)) = m                      # value is sacred
clamp:      a := clamp(a, -1+eps_a, +1-eps_a)     with eps_a = 1e-6
fuse:       a_out := tanh( (SUM w*atanh(a)) / max(SUM w, eps_w) )   with eps_w = 1e-12
bands:      A++: a>=0.75; A+: a>=0.50; A0: a>=0.25; A-: a>=0.10; else A--
hysteresis: promote if delta_a >= +0.05; demote if delta_a <= -0.05

Pre-normalization lens (reading aids; lanes stay bounded as usual).

# Declare once (manifest)
ccy_base, fx_source, index_source

# Reading transforms (do not alter the lane math; phi((m,a)) = m holds)
m_fx_norm := m_native * fx_rate(native->base)
m_real    := m_nominal * ( I_0 / I_t )

# Optional FX data-quality lane
a_fxq := tanh( 1 - |fx_mid - fx_used| / b_fx )

KPIs and lanes (declared once).

# KPI 1 — Gross margin stability vs mix-adjusted baseline
# Fit a calm-window baseline: GM ≈ beta0 + beta1*Mix_Index
res := GM - (beta0 + beta1*Mix_Index)
s   := 1.4826 * MAD(res)
a_gm := tanh( k_gm * ( 1 - |res|/s ) )

# KPI 2 — Price realization vs reference (with optional FX-quality blend)
real    := realized_price_base / list_price_base
a_real  := tanh( 1 - |real - real_ref| / b_real )

# Optional rapidity blend with FX-quality
a_realfx := tanh( ( w_r*atanh(a_real) + w_f*atanh(a_fxq) ) / max(w_r+w_f, 1e-12) )

# KPI 3 — Collections schedule (cash predictability)
q_on_time := receipts_on_or_before_due / receipts_total
a_sched   := 2*q_on_time - 1

Choose modest defaults (document once): k_gm≈1.1, b_real≈0.03, b_fx≈0.01, w_r≈0.7, w_f≈0.3, eps_a=1e-6, eps_w=1e-12.

Composite stability index (one-look).

a_index := tanh( ( atanh(a_gm) + atanh(a_realfx) + atanh(a_sched) ) / 3 )

Strength lens (for ranking margin drift).

S(m,a) := m_gm * a_gm

What the timeline shows (anonymized narrative).

  • Early: Reported GM stable and high; lanes positive (A+).
  • Mid: Price pass-through lags → a_real (or a_realfx) softens; a_gm and a_sched trend toward A0.
  • Late: Composite a_index lands in A- while GM still looks respectable; strength S(m,a) weakens steadily, signaling elevated risk of visible GM compression and DSO drift.

Actions this would have triggered (examples).

  • Early slide (A+→A0): tighten pass-through cadence; hedge review; regional pricing experiments.
  • Sustained A0/A-: AR tightening in affected corridors; mix re-weighting; CFO oversight on FX and near-term cash predictability.

Calculator-fast replication (no data embedded).

# Step 0 — Fix knobs once
eps_a=1e-6; eps_w=1e-12
k_gm=1.1; b_real=0.03; b_fx=0.01; w_r=0.7; w_f=0.3

# Step 1 — Fit calm baseline for GM
fit GM ≈ beta0 + beta1*Mix_Index   # pick a calm window; document it

# Step 2 — Lanes (clamp before any atanh)
res   := GM - (beta0 + beta1*Mix_Index)
s     := 1.4826 * MAD(res)
a_gm  := clamp( tanh( k_gm * ( 1 - |res|/s ) ) )

real     := realized_price_base / list_price_base
a_real   := clamp( tanh( 1 - |real - real_ref| / b_real ) )

# optional FX-quality lane, then rapidity blend
a_fxq    := clamp( tanh( 1 - |fx_mid - fx_used| / b_fx ) )
a_realfx := clamp( tanh( ( w_r*atanh(a_real) + w_f*atanh(a_fxq) ) / max(w_r+w_f, 1e-12) ) )

q_on_time := receipts_on_or_before_due / receipts_total
a_sched   := clamp( 2*q_on_time - 1 )

# Step 3 — Composite and strength
a_index := tanh( (atanh(a_gm) + atanh(a_realfx) + atanh(a_sched)) / 3 )
S_gm    := GM * a_gm

# Step 4 — Bands + hysteresis
band := band_from(a_index) with promote>=+0.05, demote<=-0.05

# Step 5 — Order-invariance for rollups (if any)
# use U/W fuse on lanes with declared weights

Artifacts you can obtain from the repository link (no dataset here).

  • Minimal scripts for a_gm, a_real/a_realfx, a_sched, a_index, S(m,a).
  • A manifest with knobs and knobs_hash.
  • Optional stamped CSVs for replayable evidence.

Navigation
Previous: SSM-Audit – Case Study B: Growth Steady, Foundations Eroding (4.1B)
Next: SSM-Audit – Public Case Study: Audit Benchmark (4.2)


Directory of Pages
SSM-Audit – Table of Contents


Frequently asked questions
SSM-Audit Q & A


Explore Further
https://github.com/OMPSHUNYAYA/Symbolic-Mathematical-Audit

Disclaimer
Research/observation only. Not for operational, safety-critical, or legal decision-making.