SSM-Audit – Implementation Guide (2.4–2.6)

2.4 — Streaming/batch equivalence (order-invariant fusion)
Publish a lane per row; fuse lanes the same way for rollups so batch == stream == shuffled (within rounding tolerance).

# Canonical streaming accumulator (order-invariant)
# For observations with lanes a_i and weights w_i >= 0:

# Safety clamp (always before atanh)
a_i := clamp(a_i, -1+eps_a, +1-eps_a)        # eps_a = 1e-6

# Accumulate rapidities
U := SUM_i w_i * atanh(a_i)
W := SUM_i w_i

# Decode once at the end with a guarded denominator
a_out := tanh( U / max(W, eps_w) )           # eps_w = 1e-12

# Typical weights (declare once)
# w_i := |m_i|^gamma  with gamma = 1.0     # magnitude-aware
# or  w_i := 1                             # uniform

Because U and W are simple sums, any processing order yields the same a_out (up to rounding).


2.5 — Bands and hysteresis (what leaders actually see)
Use gentle defaults; declare them once so everyone shares the same rules.

# Bands (executive-friendly defaults)
A++: a>=0.75
A+ : 0.50<=a<0.75
A0 : 0.25<=a<0.50
A- : 0.10<=a<0.25
A--: a<0.10

# Hysteresis (anti-flicker state machine)
promote if delta_a >= +0.05
demote  if delta_a <= -0.05

# Reference logic
def band_of(a):
    if a >= 0.75: return "A++"
    if a >= 0.50: return "A+"
    if a >= 0.25: return "A0"
    if a >= 0.10: return "A-"
    return "A--"

Leaders read the labels; teams can inspect a trends underneath.


2.6 — Minimal manifest (governance contract)
Plain ASCII kept beside the data. Pin knobs once; replays become deterministic. phi((m,a)) = m holds throughout.

[SSM_AUDIT_MANIFEST]
schema_version = 1
build_id       = <short tag>
date_utc       = <YYYY-MM-DD>

# Core clamps and fusion
eps_a = 1e-6
eps_w = 1e-12
gamma = 1.0
division_policy = strict

# Bands and hysteresis
bands      = {A++=0.75, A+=0.50, A0=0.25, A-=0.10, A--=-inf}
hysteresis = {promote=0.05, demote=-0.05}

# Declared mappers (pin parameters you use)
mappings = { AR:coverage(...), Refunds:agreement(...), Forecast:residual(...), KPI_X:zeozo(...) }

# Optional ZEOZO/SYASYS knobs (declare only if used)
lam = 0.10
mu  = 0.04
rho = 0.90
kappa = 0.50
R = 8.0
muR = ln(2)/R

# Optional extended keys (only if applicable)
ccy_base = <ISO>
fx_source = <provider>
fx_time = <ISO8601>
index_source = <series_id>
index_time = <ISO8601>
privacy_mode = aggregate_only
g_macro_policy = none

# Deterministic fingerprint (computed from knobs)
conformance_checksum = <hex>

knobs_hash := sha256( ascii(canonical_json({eps_a,eps_w,gamma,division_policy,bands,hysteresis,mappings,lam,mu,rho,kappa,muR})) )
Any knob change must flip knobs_hash; numbers stay numbers: phi((m,a)) = m.


Navigation
Previous: SSM-Audit – Implementation Guide (2.1–2.3)
Next: SSM-Audit – Implementation Guide (2.7–2.9)


Directory of Pages
SSM-Audit – Table of Contents


Frequently asked questions
SSM-Audit – Q & A