@@ -930,11 +930,16 @@ jobs:
930930 mean_nonregression = float(mean["ratioBootstrap95Ci"][1]) <= 1.05
931931 p95_nonregression = float(p95["ratioBootstrap95Ci"][1]) <= 1.05
932932 p99_nonregression = float(p99["ratioBootstrap95Ci"][1]) <= 1.10
933+ candidate_tps_healthy = all(
934+ 19.9 <= float(value["observedTps"]) <= 20.5
935+ for value in metrics_by_variant["B"]
936+ )
933937 scenario_passed = formal and all((
934938 primary_improvement,
935939 mean_nonregression,
936940 p95_nonregression,
937941 p99_nonregression,
942+ candidate_tps_healthy,
938943 ))
939944 if not formal:
940945 conclusion = "exploratory-no-winner"
@@ -954,11 +959,20 @@ jobs:
954959 "",
955960 f"A is official upstream Jenkins #163; B is production candidate "
956961 f"`{candidate_source[:7]}`. ",
957- "Smoke evidence is exploratory and never declares a winner.",
962+ ("Formal evidence is evaluated against the pre-registered gates."
963+ if formal else
964+ "Smoke evidence is exploratory and never declares a winner."),
958965 "",
959966 "| Metric | Upstream median | Rewrite median | Median B/A | Ratio 95% CI | Registered use |",
960967 "|---|---:|---:|---:|---:|---|",
961968 ]
969+ if formal and scenario == "block-active":
970+ lines[5:5] = [
971+ "Load-regime rule: sustained block load may saturate official upstream A "
972+ "when the 120-second window still contains at least 100 tick samples; "
973+ "candidate B must remain in the 19.9-20.5 TPS regime.",
974+ "",
975+ ]
962976 for metric, unit in metric_specs:
963977 analysis = analyses[metric]
964978 a_median = statistics.median(float(value[metric]) for value in metrics_by_variant["A"])
@@ -986,7 +1000,12 @@ jobs:
9861000 "",
9871001 f"Scenario conclusion: **{conclusion}**.",
9881002 "",
989- "`observedTps` is capped near 20 on a healthy server; MSPT is the primary effect-size evidence.",
1003+ ("Candidate `observedTps` must stay near 20; saturated upstream throughput is "
1004+ "reported directly for the sustained block load. MSPT remains the primary "
1005+ "effect-size evidence."
1006+ if formal and scenario == "block-active" else
1007+ "`observedTps` is capped near 20 on a healthy server; MSPT is the primary "
1008+ "effect-size evidence."),
9901009 "",
9911010 f"- Upstream source/artifact: `{upstream_source}` / `{upstream_artifact}`",
9921011 f"- Candidate source/artifact: `{candidate_source}` / `{candidate_artifact}`",
@@ -1025,6 +1044,17 @@ jobs:
10251044 "ratioCiUpperMaximum": 1.10,
10261045 "passed": p99_nonregression if formal else None,
10271046 },
1047+ "candidateHealthyTps": {
1048+ "minimum": 19.9,
1049+ "maximum": 20.5,
1050+ "passed": candidate_tps_healthy if formal else None,
1051+ },
1052+ },
1053+ "loadRegimePolicy": {
1054+ "upstreamSaturationAllowed": formal and scenario == "block-active",
1055+ "minimumUpstreamTickSamples": (
1056+ 100 if formal and scenario == "block-active" else None
1057+ ),
10281058 },
10291059 "metrics": {
10301060 metric: {
0 commit comments