swactor/crates/simulation/scenarios/calibration/n3_1779733878_repro.toml

167 lines
4.7 KiB
TOML
Raw Normal View History

# Calibration scenario paired with deployment bundle `1779733878`.
# `N3_SWIM_TUNING_SPEC.md §5.3` is normative: the calibration scenario
# configured to mirror the deployment's latency and topology must
# produce fewer than 300 `SwimTransition` events in a 7-minute
# virtual run (an order-of-magnitude reduction from the
# deployment-observed 1701).
#
# Topology: four SWIM peers (orchestrator + three stages) routed
# through a single own-relay. `conn_type=Relay` everywhere matches
# the postmortem's "every peer connection is Relay" observation.
#
# Per-link latency mirrors the tier-2 RTT distribution from the
# postmortem (§"UDP echo probes"):
# - orchestrator: 293 ms RTT → ~147 ms one-way to relay
# - stage-0: 181 ms RTT → ~91 ms one-way
# - stage-1: 405 ms RTT → ~202 ms one-way
# - stage-2: 184 ms RTT → ~92 ms one-way
#
# Because the scenario uses a single `default_link` policy, the
# central value is set to ~200 ms (between the high-RTT stage-1 and
# the lower-RTT others) with wide jitter (75 ms stddev) so the
# distribution covers the deployment's spread per peer.
name = "n3_1779733878_repro"
seed = 1779733878
duration_ns = 420_000_000_000 # 7 min
[default_tick]
# 100 ms tick: a compromise between the production driver's
# ~20 ms inner loop and the prior calibration scenarios' 200 ms
# tick. The finer granularity gives sharper probe-timeout
# enforcement than 200 ms while keeping the 7-minute run
# under 5k ticks per peer.
period_ns = 100_000_000 # 100 ms
[default_link]
# Latency band mirrors the deployment's tier-2 RTT distribution
# (181–405 ms). One-way per-link latency near the median plus
# jitter models the relay HOL queueing on the slower legs. The
# 30 ms stddev is calibrated so the simulated p99 ack RTT
# (≈ 2*(200 + 3*30) = 580 ms) sits near the postmortem's
# stage-1 405 ms tier-2 RTT plus a relay-amplification margin.
latency_ns = 200_000_000 # 200 ms one-way
jitter_stddev_ns = 30_000_000 # 30 ms — intra-node RTT spread
loss_prob_ppm = 0
reorder_prob_ppm = 0
bandwidth_bps = 25_000_000
cold_dial_penalty_ns = 200_000_000
cache_warm_after_ns = 200_000_000
cache_invalidate_after_idle_ns = 30_000_000_000
[[relays]]
id = "own_relay"
ingress_capacity_bps = 1_000_000_000
egress_capacity_bps_per_link = 100_000_000
queue_depth_bytes = 65_536
cold_start_penalty_ns = 0
[[peers]]
id = "orchestrator"
kind = "swim"
initial_state = "alive"
# Retuned operating point, mirrored at the scenario's 200 ms tick.
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
[[peers]]
id = "stage-0"
kind = "swim"
initial_state = "alive"
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
[[peers]]
id = "stage-1"
kind = "swim"
initial_state = "alive"
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
[[peers]]
id = "stage-2"
kind = "swim"
initial_state = "alive"
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
# Every host pair routes through the own-relay (every connection
# is `conn_type=Relay`, per the postmortem's topology section).
[[links]]
from = "orchestrator"
to = "stage-0"
via = "own_relay"
[[links]]
from = "stage-0"
to = "orchestrator"
via = "own_relay"
[[links]]
from = "orchestrator"
to = "stage-1"
via = "own_relay"
[[links]]
from = "stage-1"
to = "orchestrator"
via = "own_relay"
[[links]]
from = "orchestrator"
to = "stage-2"
via = "own_relay"
[[links]]
from = "stage-2"
to = "orchestrator"
via = "own_relay"
[[links]]
from = "stage-0"
to = "stage-1"
via = "own_relay"
[[links]]
from = "stage-1"
to = "stage-0"
via = "own_relay"
[[links]]
from = "stage-0"
to = "stage-2"
via = "own_relay"
[[links]]
from = "stage-2"
to = "stage-0"
via = "own_relay"
[[links]]
from = "stage-1"
to = "stage-2"
via = "own_relay"
[[links]]
from = "stage-2"
to = "stage-1"
via = "own_relay"
[[snapshots]]
at_ns = 1_000_000_000
[[snapshots]]
at_ns = 30_000_000_000
[[snapshots]]
at_ns = 120_000_000_000
[[snapshots]]
at_ns = 300_000_000_000
[[snapshots]]
at_ns = 419_000_000_000
# Acceptance §5.5: self_incarnation_peak stays in the prior
# tune's 7–10 band. Set the bound on every peer at 10.
[[assertions]]
kind = "self_incarnation_bounded"
peer = "orchestrator"
max_value = 10
[[assertions]]
kind = "self_incarnation_bounded"
peer = "stage-0"
max_value = 10
[[assertions]]
kind = "self_incarnation_bounded"
peer = "stage-1"
max_value = 10
[[assertions]]
kind = "self_incarnation_bounded"
peer = "stage-2"
max_value = 10