Skip to content

Tight-race expireAfter Soak — Scenario P

What this validates

A 12-hour real-EKS soak where leadTime genuinely races expireAfter. Demonstrates: (1) the graceful surge always finishes first (expired stays 0), and (2) forceful fallback fires deterministically when a graceful surge no longer fits.

The pool ran with fixed expireAfter: 2h12m — just above derived leadTime of 1h12m — under sub-daily windows (48 × 30 min/day). This validates §3.2 live. See §7.2 for the assumptions validated, Scenario O for the earlier forceful-fallback validation this extends, and the runbook for metric definitions.

Run: 2026-07-14T14:20:29Z (T0) → +12h, EKS Auto Mode, K8s 1.36, us-west-2. Canonical record: test/e2e/eks-automode/VALIDATION.md (§ "Run: 2026-07-15 — Scenario P").

Verdict: CLEAN PASS (12 PASS; criterion 13 N/A — never exercised).

71/71068.3 min56 s
Graceful rotations (60 in 12h = 5.0/h)expired · failure · fallback · short_lead · restartsMin deadline marginEpilogue: release → fallback

Derived schedule

Earlier PoCs used daily windows with huge expireAfter (E=336h) — the race was always won by a wide margin. This run puts E at 2h12m and holds a genuinely tight race for 12 hours. surge.forcefulFallback stays armed the whole time (demonstrating quiescence).

QuantityValue
t_rot (bound)5m + 5m + 2m = 12m
t_rot_est (forecast)5m + 5m = 10m
leadTime2·30m + 12m = 1h12m
ageThreshold (auto)2h12m − 1h12m = 1h
C (per-window)ceil(28m / 12m) = 3 (6/h)
Steady loadN=5, 5/h → 83% of forecast (tight)
Expected findingsExactly 1 warn: RotationSpansNextWindow

Derivation pinned by TestDeriveScenarioPSoak in internal/schedule/schedule_test.go.

Margin picture

From T0 to end of recording (T0+14.1h): 71 rotations, all graceful make-before-break surge onto a newly provisioned node. 60 inside [T0, T_end] (= 5.0/h), 11 more during the epilogue at unchanged ~12-min cadence.

Margin (deadline − completion): 68.3–71.2 min across all 71 (spread < 3 min). No degradation accumulated.

Figure 1 — deadline margin of all 72 rotations

x: elapsed time since T0. y: time still left to the deadline at completion (minutes). Dots right of the T_end rule (end of the 12h observation window; 60 rotations inside it) completed while the attended epilogue ran — cadence and margin unchanged. The single orange dot is the epilogue’s deliberate fallback firing (margin 10.1 min) — the drop from the main-pool band is the whole run in one picture.

020406080minT0+0hT0+2hT0+4hT0+6hT0+8hT0+10hT0+12hT0+14hmain pool, 71 rotations: 68.3–71.2 minT_endgraceful surge claim fhx2b done 2026-07-14T14:20:29Z margin 70.3 mingraceful surge claim xdjh8 done 2026-07-14T14:32:30Z margin 70.4 mingraceful surge claim 9xfpf done 2026-07-14T14:44:31Z margin 70.4 mingraceful surge claim xl8fg done 2026-07-14T14:56:34Z margin 70.4 mingraceful surge claim ksjxd done 2026-07-14T15:09:36Z margin 69.5 mingraceful surge claim s88b7 done 2026-07-14T15:20:46Z margin 70.4 mingraceful surge claim bvpc6 done 2026-07-14T15:32:27Z margin 70.8 mingraceful surge claim 4txxs done 2026-07-14T15:45:06Z margin 70.2 mingraceful surge claim 7s7dt done 2026-07-14T15:57:11Z margin 70.2 mingraceful surge claim wbsfb done 2026-07-14T16:09:07Z margin 70.3 mingraceful surge claim m4jzw done 2026-07-14T16:21:26Z margin 70.1 mingraceful surge claim w4r59 done 2026-07-14T16:32:58Z margin 70.7 mingraceful surge claim 8bhbp done 2026-07-14T16:45:26Z margin 70.3 mingraceful surge claim vrtvs done 2026-07-14T16:57:47Z margin 70 mingraceful surge claim zwlds done 2026-07-14T17:09:47Z margin 70.1 mingraceful surge claim sh6s8 done 2026-07-14T17:22:03Z margin 69.9 mingraceful surge claim xhbsc done 2026-07-14T17:33:55Z margin 70.1 mingraceful surge claim hghwx done 2026-07-14T17:45:52Z margin 70.2 mingraceful surge claim r284b done 2026-07-14T17:57:52Z margin 70.3 mingraceful surge claim q592n done 2026-07-14T18:09:48Z margin 70.5 mingraceful surge claim rwqpb done 2026-07-14T18:22:29Z margin 69.9 mingraceful surge claim 6gdtf done 2026-07-14T18:33:35Z margin 70.8 mingraceful surge claim 76xn9 done 2026-07-14T18:46:28Z margin 70 mingraceful surge claim zw4gm done 2026-07-14T18:58:19Z margin 70.3 mingraceful surge claim 8bcgn done 2026-07-14T19:10:40Z margin 70 mingraceful surge claim 8hld7 done 2026-07-14T19:22:13Z margin 70.5 mingraceful surge claim 656fc done 2026-07-14T19:34:25Z margin 70.4 mingraceful surge claim d4d5d done 2026-07-14T19:47:01Z margin 69.9 mingraceful surge claim 8nkrs done 2026-07-14T19:58:18Z margin 70.7 mingraceful surge claim pmlpq done 2026-07-14T20:10:38Z margin 70.4 mingraceful surge claim 6wvqx done 2026-07-14T20:22:30Z margin 70.7 mingraceful surge claim kmh4m done 2026-07-14T20:34:25Z margin 70.8 mingraceful surge claim xdtc9 done 2026-07-14T20:46:56Z margin 70.4 mingraceful surge claim jqmll done 2026-07-14T20:58:35Z margin 70.8 mingraceful surge claim xsxbk done 2026-07-14T21:11:34Z margin 69.9 mingraceful surge claim 8tp7t done 2026-07-14T21:24:00Z margin 69.6 mingraceful surge claim pdcjt done 2026-07-14T21:35:18Z margin 70.4 mingraceful surge claim jnrdw done 2026-07-14T21:47:21Z margin 70.4 mingraceful surge claim 8hbzb done 2026-07-14T22:01:34Z margin 68.3 mingraceful surge claim 7thv5 done 2026-07-14T22:10:56Z margin 71 mingraceful surge claim j8xsl done 2026-07-14T22:22:54Z margin 71.1 mingraceful surge claim fkwv7 done 2026-07-14T22:35:41Z margin 70.4 mingraceful surge claim fjkq9 done 2026-07-14T22:47:10Z margin 71 mingraceful surge claim vsd8c done 2026-07-14T23:02:06Z margin 70.2 mingraceful surge claim z9dl8 done 2026-07-14T23:11:27Z margin 70.5 mingraceful surge claim p9qdf done 2026-07-14T23:23:18Z margin 70.8 mingraceful surge claim hwgp8 done 2026-07-14T23:35:10Z margin 71 mingraceful surge claim kgkmw done 2026-07-14T23:49:06Z margin 69.3 mingraceful surge claim mjwgw done 2026-07-15T00:02:01Z margin 70.5 mingraceful surge claim jvjhr done 2026-07-15T00:10:59Z margin 71.2 mingraceful surge claim b9b96 done 2026-07-15T00:23:11Z margin 71 mingraceful surge claim rxf2c done 2026-07-15T00:36:09Z margin 70.1 mingraceful surge claim xv8m2 done 2026-07-15T00:48:49Z margin 70.5 mingraceful surge claim dxq8p done 2026-07-15T01:03:19Z margin 69.3 mingraceful surge claim kbm2x done 2026-07-15T01:11:15Z margin 71 mingraceful surge claim lnlxb done 2026-07-15T01:23:16Z margin 71.1 mingraceful surge claim kgj2d done 2026-07-15T01:36:04Z margin 70.3 mingraceful surge claim tr854 done 2026-07-15T01:49:04Z margin 70.4 mingraceful surge claim d94p8 done 2026-07-15T02:02:21Z margin 71.2 mingraceful surge claim btlwz done 2026-07-15T02:12:01Z margin 70.3 mingraceful surge claim nssls done 2026-07-15T02:24:09Z margin 70.2 mingraceful surge claim xwpp9 done 2026-07-15T02:36:18Z margin 70.2 mingraceful surge claim 2fmbr done 2026-07-15T02:49:30Z margin 70.1 mingraceful surge claim 88rjv done 2026-07-15T03:02:57Z margin 70.7 mingraceful surge claim qdh2f done 2026-07-15T03:12:55Z margin 70.1 mingraceful surge claim 97mm5 done 2026-07-15T03:24:26Z margin 70.3 mingraceful surge claim rbv8l done 2026-07-15T03:36:23Z margin 70.5 mingraceful surge claim 77m27 done 2026-07-15T03:49:49Z margin 70.1 mingraceful surge claim 5qwn6 done 2026-07-15T04:04:16Z margin 69.8 mingraceful surge claim zv9gp done 2026-07-15T04:14:16Z margin 69.1 minforceful fallback claim epi-gtx42 done 2026-07-15T04:24:46Z margin 10.1 mingraceful surge claim 49pqr done 2026-07-15T04:25:24Z margin 70 minepi: 10.1 min (deliberate firing)
graceful surge (main pool, 71) forceful fallback (epilogue, 1)

The 13 criteria

#CriterionVerdict
1expired == 0PASS
2success ≈5/h, total ≥ 40PASS (60 in 12h)
3Main-pool forceful_fallback == 0PASS (quiescence)
4short_lead_nodes == 0PASS (909 scrapes)
5Restarts 0, seq contiguousPASS
6Load present at every snapshotPASS (desired=available=ready=5)
7Config-under-test throughoutPASS (6 gauges × 909 scrapes)
8Per-rotation margin > 0PASS (min 68.3m)
9End census cleanPASS (all 5 claims < A)
10No unexpected Karpenter disruptionPASS
11Epi: frozen = candidate-onlyPASS (~2h hold)
12Epi: release fires fallbackPASS (56 s)
13Abort rule (missed release)N/A
Full criterion observations — click to expand
#Observed detail
10 for full run + tail-follow + epilogue; no Karpenter Expiration events
260 in [T0, T_end] (5.0/h); 71 by end (72 incl. epi); steady ~12m cadence
30 the entire run — first demonstration of quiescence
4max 0 across all 909 scrapes
5controller restartCount=0 for 12h; 0 gaps, 0 restarts, 0 SCRAPE_ERROR
6desired=available=ready=5 throughout; no Pending backlog
7Six derived gauges exact at 909/909 scrapes; both policies Accepted; exactly 1 expected warn
8min 68.3 / median 70.3 / max 71.2 min (n=71)
9At T_end all 5 claims aged 11–59m (right-censored); 0 stale, 0 failed
10Only DisruptionBlocked/Unconsolidatable (budgets + do-not-disrupt suppressing)
11candidates=1, in_progress=0 held ~2h while frozen
12See epilogue below (56 s, zero placeholder, main pool undisturbed)
13Release completed inside bounds; fail-closed verified offline only

Anatomy of a rotation

Each of the 71 rotations followed the same sequence:

  1. Claim reaches age 1h (= A) → placeholder Pod created
  2. Karpenter provisions new node → placeholder binds → surge node Ready (surgeWait median 34 s, range 23–54 s)
  3. Both nodes get do-not-disrupt → old NodeClaim deleted → voluntary drain (drain median 44 s, range 18–83 s)
  4. Cleanup → total median 81 s (range 45–131 s). Old node collected by WhenEmpty/60s

Figure 2 — time breakdown of each rotation (surgeWait + drain)

y: seconds. The lower segment is the wait from placeholder creation to the surge node going Ready; the upper segment is the old node’s drain. The design bound on t_rot is 720 s — measured totals are 45–131 s (median 81 s), always under a fifth of it; that headroom is what keeps beating the backstop.

0306090120sclaim fhx2b (done 2026-07-14T14:20:29Z) surgeWait 40s + drain 44s / total 83sclaim xdjh8 (done 2026-07-14T14:32:30Z) surgeWait 40s + drain 39s / total 79sclaim 9xfpf (done 2026-07-14T14:44:31Z) surgeWait 41s + drain 35s / total 76sclaim xl8fg (done 2026-07-14T14:56:34Z) surgeWait 24s + drain 48s / total 73sclaim ksjxd (done 2026-07-14T15:09:36Z) surgeWait 53s + drain 77s / total 131sclaim s88b7 (done 2026-07-14T15:20:46Z) surgeWait 38s + drain 38s / total 76sclaim bvpc6 (done 2026-07-14T15:32:27Z) surgeWait 25s + drain 28s / total 52sclaim 4txxs (done 2026-07-14T15:45:06Z) surgeWait 38s + drain 49s / total 87sclaim 7s7dt (done 2026-07-14T15:57:11Z) surgeWait 27s + drain 59s / total 86sclaim wbsfb (done 2026-07-14T16:09:07Z) surgeWait 36s + drain 42s / total 78sclaim m4jzw (done 2026-07-14T16:21:26Z) surgeWait 37s + drain 55s / total 92sclaim w4r59 (done 2026-07-14T16:32:58Z) surgeWait 37s + drain 22s / total 59sclaim 8bhbp (done 2026-07-14T16:45:26Z) surgeWait 24s + drain 58s / total 82sclaim vrtvs (done 2026-07-14T16:57:47Z) surgeWait 23s + drain 74s / total 97sclaim zwlds (done 2026-07-14T17:09:47Z) surgeWait 34s + drain 59s / total 94sclaim sh6s8 (done 2026-07-14T17:22:03Z) surgeWait 24s + drain 80s / total 104sclaim xhbsc (done 2026-07-14T17:33:55Z) surgeWait 38s + drain 53s / total 91sclaim hghwx (done 2026-07-14T17:45:52Z) surgeWait 24s + drain 61s / total 85sclaim r284b (done 2026-07-14T17:57:52Z) surgeWait 27s + drain 53s / total 79sclaim q592n (done 2026-07-14T18:09:48Z) surgeWait 27s + drain 44s / total 71sclaim rwqpb (done 2026-07-14T18:22:29Z) surgeWait 24s + drain 81s / total 105sclaim 6gdtf (done 2026-07-14T18:33:35Z) surgeWait 24s + drain 24s / total 48sclaim 76xn9 (done 2026-07-14T18:46:28Z) surgeWait 38s + drain 57s / total 95sclaim zw4gm (done 2026-07-14T18:58:19Z) surgeWait 38s + drain 43s / total 82sclaim 8bcgn (done 2026-07-14T19:10:40Z) surgeWait 26s + drain 71s / total 97sclaim 8hld7 (done 2026-07-14T19:22:13Z) surgeWait 37s + drain 29s / total 66sclaim 656fc (done 2026-07-14T19:34:25Z) surgeWait 38s + drain 34s / total 73sclaim d4d5d (done 2026-07-14T19:47:01Z) surgeWait 24s + drain 81s / total 105sclaim 8nkrs (done 2026-07-14T19:58:18Z) surgeWait 23s + drain 33s / total 56sclaim pmlpq (done 2026-07-14T20:10:38Z) surgeWait 37s + drain 33s / total 70sclaim 6wvqx (done 2026-07-14T20:22:30Z) surgeWait 34s + drain 23s / total 58sclaim kmh4m (done 2026-07-14T20:34:25Z) surgeWait 25s + drain 23s / total 48sclaim xdtc9 (done 2026-07-14T20:46:56Z) surgeWait 33s + drain 39s / total 73sclaim jqmll (done 2026-07-14T20:58:35Z) surgeWait 24s + drain 22s / total 46sclaim xsxbk (done 2026-07-14T21:11:34Z) surgeWait 36s + drain 64s / total 100sclaim 8tp7t (done 2026-07-14T21:24:00Z) surgeWait 39s + drain 83s / total 122sclaim pdcjt (done 2026-07-14T21:35:18Z) surgeWait 35s + drain 39s / total 74sclaim jnrdw (done 2026-07-14T21:47:21Z) surgeWait 24s + drain 49s / total 73sclaim 8hbzb (done 2026-07-14T22:01:34Z) surgeWait 42s + drain 38s / total 81sclaim 7thv5 (done 2026-07-14T22:10:56Z) surgeWait 37s + drain 23s / total 60sclaim j8xsl (done 2026-07-14T22:22:54Z) surgeWait 24s + drain 28s / total 52sclaim fkwv7 (done 2026-07-14T22:35:41Z) surgeWait 39s + drain 55s / total 94sclaim fjkq9 (done 2026-07-14T22:47:10Z) surgeWait 25s + drain 22s / total 47sclaim vsd8c (done 2026-07-14T23:02:06Z) surgeWait 39s + drain 61s / total 100sclaim z9dl8 (done 2026-07-14T23:11:27Z) surgeWait 39s + drain 44s / total 83sclaim p9qdf (done 2026-07-14T23:23:18Z) surgeWait 30s + drain 38s / total 68sclaim hwgp8 (done 2026-07-14T23:35:10Z) surgeWait 32s + drain 22s / total 54sclaim kgkmw (done 2026-07-14T23:49:06Z) surgeWait 52s + drain 54s / total 106sclaim mjwgw (done 2026-07-15T00:02:01Z) surgeWait 40s + drain 48s / total 88sclaim jvjhr (done 2026-07-15T00:10:59Z) surgeWait 24s + drain 22s / total 46sclaim b9b96 (done 2026-07-15T00:23:11Z) surgeWait 31s + drain 23s / total 54sclaim rxf2c (done 2026-07-15T00:36:09Z) surgeWait 25s + drain 80s / total 105sclaim xv8m2 (done 2026-07-15T00:48:49Z) surgeWait 54s + drain 28s / total 81sclaim dxq8p (done 2026-07-15T01:03:19Z) surgeWait 41s + drain 65s / total 106sclaim kbm2x (done 2026-07-15T01:11:15Z) surgeWait 34s + drain 22s / total 56sclaim lnlxb (done 2026-07-15T01:23:16Z) surgeWait 27s + drain 28s / total 55sclaim kgj2d (done 2026-07-15T01:36:04Z) surgeWait 25s + drain 73s / total 97sclaim tr854 (done 2026-07-15T01:49:04Z) surgeWait 24s + drain 69s / total 93sclaim d94p8 (done 2026-07-15T02:02:21Z) surgeWait 27s + drain 18s / total 45sclaim btlwz (done 2026-07-15T02:12:01Z) surgeWait 31s + drain 34s / total 64sclaim nssls (done 2026-07-15T02:24:09Z) surgeWait 23s + drain 62s / total 85sclaim xwpp9 (done 2026-07-15T02:36:18Z) surgeWait 42s + drain 48s / total 90sclaim 2fmbr (done 2026-07-15T02:49:30Z) surgeWait 38s + drain 58s / total 96sclaim 88rjv (done 2026-07-15T03:02:57Z) surgeWait 26s + drain 33s / total 59sclaim qdh2f (done 2026-07-15T03:12:55Z) surgeWait 35s + drain 62s / total 97sclaim 97mm5 (done 2026-07-15T03:24:26Z) surgeWait 24s + drain 39s / total 63sclaim rbv8l (done 2026-07-15T03:36:23Z) surgeWait 23s + drain 33s / total 56sclaim 77m27 (done 2026-07-15T03:49:49Z) surgeWait 35s + drain 42s / total 77sclaim 5qwn6 (done 2026-07-15T04:04:16Z) surgeWait 36s + drain 62s / total 98sclaim zv9gp (done 2026-07-15T04:14:16Z) surgeWait 42s + drain 79s / total 121sclaim 49pqr (done 2026-07-15T04:25:24Z) surgeWait 33s + drain 53s / total 87sT0+0hT0+3hT0+7hT0+11hT0+14h
surgeWait (placeholder created → surge node Ready) drain (old claim deleted → drained)
Open the full per-rotation ledger — 72 rows (71 main + 1 epilogue)

Birth/completion are UTC. margin = birth + 2h12m − completion. Every surge target is a freshly provisioned EC2 instance. The epilogue row's "—" (no placeholder, no surge node) is itself the evidence of the surge-less path.

#claimmodebirthdonesurgeWaitdraintotalmargin (min)surge node
1fhx2bsurge07-14 13:18:5007-14 14:20:2940s44s83s70.3i-073168dd1b078525f
2xdjh8surge07-14 13:30:5307-14 14:32:3040s39s79s70.4i-09dcbe1f5d6d88d7c
39xfpfsurge07-14 13:42:5707-14 14:44:3141s35s76s70.4i-0ea97241df5cd15d2
4xl8fgsurge07-14 13:55:0007-14 14:56:3424s48s73s70.4i-0e2c826c7f0d82e1e
5ksjxdsurge07-14 14:07:0407-14 15:09:3653s77s131s69.5i-07c3fd68b28570fb0
6s88b7surge07-14 14:19:0807-14 15:20:4638s38s76s70.4i-05701db7c4c26e742
7bvpc6surge07-14 14:31:1307-14 15:32:2725s28s52s70.8i-06610ad280717ecb4
84txxssurge07-14 14:43:1807-14 15:45:0638s49s87s70.2i-0732ee95c07077219
97s7dtsurge07-14 14:55:2307-14 15:57:1127s59s86s70.2i-028415c25f2709a31
10wbsfbsurge07-14 15:07:2707-14 16:09:0736s42s78s70.3i-030b61343e3e0405d
11m4jzwsurge07-14 15:19:3207-14 16:21:2637s55s92s70.1i-08665c82484969e3b
12w4r59surge07-14 15:31:3707-14 16:32:5837s22s59s70.7i-0ac7d9f8c7de48fd5
138bhbpsurge07-14 15:43:4207-14 16:45:2624s58s82s70.3i-096f1d8ecdea85ea1
14vrtvssurge07-14 15:55:4707-14 16:57:4723s74s97s70.0i-0c9f26564102a018e
15zwldssurge07-14 16:07:5207-14 17:09:4734s59s94s70.1i-01aebd4e635a7a1ef
16sh6s8surge07-14 16:19:5607-14 17:22:0324s80s104s69.9i-01b49d56eb91cc36c
17xhbscsurge07-14 16:32:0107-14 17:33:5538s53s91s70.1i-054e29bf46d2ddb04
18hghwxsurge07-14 16:44:0607-14 17:45:5224s61s85s70.2i-02d851cb5b6421813
19r284bsurge07-14 16:56:1107-14 17:57:5227s53s79s70.3i-026b29c8cdf04f427
20q592nsurge07-14 17:08:1507-14 18:09:4827s44s71s70.5i-0299e5a36131f1a53
21rwqpbsurge07-14 17:20:2107-14 18:22:2924s81s105s69.9i-01362e558662da0a8
226gdtfsurge07-14 17:32:2607-14 18:33:3524s24s48s70.8i-01256b5baaa58ea6d
2376xn9surge07-14 17:44:3007-14 18:46:2838s57s95s70.0i-09cc4576bdb2f9954
24zw4gmsurge07-14 17:56:3507-14 18:58:1938s43s82s70.3i-0c8662b78afae7195
258bcgnsurge07-14 18:08:4007-14 19:10:4026s71s97s70.0i-09d5061451bc138b9
268hld7surge07-14 18:20:4507-14 19:22:1337s29s66s70.5i-0053ad9546c899cf6
27656fcsurge07-14 18:32:5007-14 19:34:2538s34s73s70.4i-076c2254a9c78ebd7
28d4d5dsurge07-14 18:44:5507-14 19:47:0124s81s105s69.9i-0727f919a26d699b2
298nkrssurge07-14 18:56:5907-14 19:58:1823s33s56s70.7i-0b563214cfb435736
30pmlpqsurge07-14 19:09:0407-14 20:10:3837s33s70s70.4i-07e64b99c9d32e18a
316wvqxsurge07-14 19:21:0907-14 20:22:3034s23s58s70.7i-04a2ca7bb98062b91
32kmh4msurge07-14 19:33:1407-14 20:34:2525s23s48s70.8i-01d64316889e57c5c
33xdtc9surge07-14 19:45:2007-14 20:46:5633s39s73s70.4i-026b484c33d3d619c
34jqmllsurge07-14 19:57:2407-14 20:58:3524s22s46s70.8i-084de2d8a4645fd56
35xsxbksurge07-14 20:09:2907-14 21:11:3436s64s100s69.9i-00d71584622976033
368tp7tsurge07-14 20:21:3507-14 21:24:0039s83s122s69.6i-0b502fd445ad0c976
37pdcjtsurge07-14 20:33:4007-14 21:35:1835s39s74s70.4i-06e1f6f3806f1ec9c
38jnrdwsurge07-14 20:45:4507-14 21:47:2124s49s73s70.4i-0ab92c05b557f1add
398hbzbsurge07-14 20:57:5007-14 22:01:3442s38s81s68.3i-0837901c7b5fb0e3b
407thv5surge07-14 21:09:5507-14 22:10:5637s23s60s71.0i-02f570d8c5fd7fcca
41j8xslsurge07-14 21:22:0007-14 22:22:5424s28s52s71.1i-003922ea46c3fb04f
42fkwv7surge07-14 21:34:0607-14 22:35:4139s55s94s70.4i-084d041ac9a5866a7
43fjkq9surge07-14 21:46:1107-14 22:47:1025s22s47s71.0i-00d419f6d8287f8d8
44vsd8csurge07-14 22:00:1607-14 23:02:0639s61s100s70.2i-09324bed1c04586d9
45z9dl8surge07-14 22:09:5807-14 23:11:2739s44s83s70.5i-0035175e53982ebb5
46p9qdfsurge07-14 22:22:0307-14 23:23:1830s38s68s70.8i-05532c42763792a49
47hwgp8surge07-14 22:34:0807-14 23:35:1032s22s54s71.0i-09fdd03b5776ec630
48kgkmwsurge07-14 22:46:2407-14 23:49:0652s54s106s69.3i-0fb0f63a1fa25c348
49mjwgwsurge07-14 23:00:2907-15 00:02:0140s48s88s70.5i-067d3e9a600db37df
50jvjhrsurge07-14 23:10:0807-15 00:10:5924s22s46s71.2i-0027a501d3d908495
51b9b96surge07-14 23:22:1307-15 00:23:1131s23s54s71.0i-0c08f4d5cd021455d
52rxf2csurge07-14 23:34:1707-15 00:36:0925s80s105s70.1i-020c3d914bdd495cf
53xv8m2surge07-14 23:47:2207-15 00:48:4954s28s81s70.5i-00564c34b6324ae46
54dxq8psurge07-15 00:00:3507-15 01:03:1941s65s106s69.3i-06ca63b87ebb447dc
55kbm2xsurge07-15 00:10:1407-15 01:11:1534s22s56s71.0i-002e0c626c9965415
56lnlxbsurge07-15 00:22:2007-15 01:23:1627s28s55s71.1i-07ed6412f48b14708
57kgj2dsurge07-15 00:34:2507-15 01:36:0425s73s97s70.3i-084bb7cca02775ea4
58tr854surge07-15 00:47:3007-15 01:49:0424s69s93s70.4i-0be5128cc2cb31ace
59d94p8surge07-15 01:01:3507-15 02:02:2127s18s45s71.2i-01a1c010ed9bb8abc
60btlwzsurge07-15 01:10:2007-15 02:12:0131s34s64s70.3i-0459aab876617973b
61nsslssurge07-15 01:22:2407-15 02:24:0923s62s85s70.2i-019f5eed0b9c24fca
62xwpp9surge07-15 01:34:2907-15 02:36:1842s48s90s70.2i-0449ff069770389cb
632fmbrsurge07-15 01:47:3407-15 02:49:3038s58s96s70.1i-03b5247bae327d09a
6488rjvsurge07-15 02:01:3807-15 03:02:5726s33s59s70.7i-0adbdb142e012b81d
65qdh2fsurge07-15 02:10:5907-15 03:12:5535s62s97s70.1i-07fa42782b1206b04
6697mm5surge07-15 02:22:4707-15 03:24:2624s39s63s70.3i-0eb70b7e8fe3a72c5
67rbv8lsurge07-15 02:34:5207-15 03:36:2323s33s56s70.5i-0d032d5175f8d1b1b
6877m27surge07-15 02:47:5607-15 03:49:4935s42s77s70.1i-01b785c0e28e3d678
695qwn6surge07-15 03:02:0107-15 04:04:1636s62s98s69.8i-0651204cabf6506a8
70zv9gpsurge07-15 03:11:2007-15 04:14:1642s79s121s69.1i-07d0545749cf4c983
71epi-gtx42forceful-fallback07-15 02:22:5007-15 04:24:4648s10.1
7249pqrsurge07-15 03:23:2507-15 04:25:2433s53s87s70.0i-0507f5b02688986aa

Epilogue — deterministic fallback firing

Why a separate pool

The main run's "never fires" is only half the validation. A frozen single-node pool drives one claim across the boundary deliberately and deterministically. Pool size = 1 because completion can take up to tGP + Buffer = 7m (multi-node evidence is Scenario O).

TimeEvent
02:22:50ZEpi claim gtx42 born (pool created with freeze) → deadline d = 04:34:50Z
03:22:50ZBecomes candidate at age 1h; frozen → candidates=1, in_progress=0
04:23:50ZFreeze removed at R (interval search: d−12m < R < d−8m). 11 min left < t_rot 12m
04:24:46Z56 s after release: claim deleted (drain 48 s < 7m bound). mode=forceful-fallback, no surgeNode

Evidence:

  • forceful_fallback_total{nodepool-soak-epi} 0→1
  • ForcefulFallback Warning event with spec's message
  • Continuous placeholder ledger: zero placeholder for epi claim
  • expired stayed 0
  • Main pool undisturbed (70→71 across the window, gaps ≤ P + t_rot = 42m)

The abort rule (missed release: if freeze cannot be removed before d−8m, tear down still frozen) was not exercised. Fail-closed behavior verified offline (3 legs, all exit 3).

Reproducing this run

Runbook: test/e2e/eks-automode/SCENARIOS.md § Scenario P.

Pre-flight checks:

sh
go test ./internal/schedule/ -run TestDeriveScenarioPSoak -v  # pins A=1h / C=3 / G=2 / 1 warn
test/e2e/eks-automode/scenarios/soak-analyze-fixture.sh       # analyzer self-check

Operational notes

  • JSON logging required (logging.development: false): the analyzer reads zap JSON; console format produces empty ledger
  • Check credential lifetime up front — operator credentials expired mid-run, blinding the secondary recorder for 15 min (in-cluster primary stayed gapless)
  • Never live-patch expireAfter — recreate the pool (a patch induces Karpenter drift)
  • Cost: ≈ $11 (control plane + NAT ~20h, 5 × 2-vCPU nodes × 14h + epilogue). Remember terraform destroy

What this run settles

Spec §7.2 gains two validated rows:

  • Under sub-daily windows, leadTime beats a genuinely racing expireAfter for 12h with fallback armed but quiescent
  • The moment a claim crosses the point where graceful surge no longer fits, forceful fallback fires deterministically

Remaining open item: genuine same-AZ capacity shortage (ICE) — see roadmap (§6.2) and §7.2.