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

166 lines
4.7 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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