@@ -48,24 +48,30 @@ plotting calls-into-the-backend per tick over a *sustained* outage window:
4848 clustering, not literal lockstep — arrivals are spread, fixed backoff * preserves*
4949 the clustering).
5050- ** httpware lane:** 20 clients, full-jitter backoff + per-client budget → jitter
51- decorrelates retry timing into a near-constant rate; each client's own budget caps
52- its own amplification.
51+ decorrelates retry timing into a near-constant rate; at this client count each
52+ client's ` max_attempts=3 ` cap is what bounds its amplification (the per-client
53+ budget's floor doesn't bind until far higher per-client volume — it's the guarantee
54+ that holds as the herd grows).
5355
5456Both lanes reuse the * real* retry + budget models from the engine's source-of-truth
5557constants block, one model instance per simulated client. ** Fidelity framing that
5658must hold:** the budget is ** per-client** , not shared across the herd — at demo
57- traffic levels the * visible* flattening is jitter decorrelating timing; the budget is
58- the ceiling that keeps even a * longer* storm under ~ 1.2×. Copy says exactly that; it
59- must not imply a shared/global budget.
59+ traffic levels the * visible* flattening is jitter decorrelating timing, and
60+ httpware's peak is bounded near its ` max_attempts ` cap (~ 3×), with the per-client
61+ budget the ceiling that holds as volume grows. Copy says exactly that; it must not
62+ imply a shared/global budget or that the budget (rather than ` max_attempts ` ) does the
63+ capping at this scale.
6064
6165** Payoff metric.** The mini-tour spotlights the ** peak load multiplier** — "backend
62- saw N× baseline" (naive ~ 10×, httpware ~ 1.2×) — because it reads directly off the
63- tallest spike the strip already draws (spotlight number == visible fact). ** Total
64- calls** during the outage is a secondary, un-spotlighted counter (volume story).
65- "The flat rate leaves the backend room to recover" is the qualitative closing beat,
66- * not* a spotlighted stat — httpware's code models no backend-recovery dynamic, so no
67- invented recovery number. ~ 4 beats: outage hits → naive's first synchronized spike →
68- httpware stays flat (jitter + budget) → peak-multiplier payoff.
66+ saw N× baseline". Measured against the fixed seed: ** naive ~ 70×** (unbounded retries
67+ explode and keep climbing with outage length) ** vs httpware ~ 3×** (bounded by
68+ ` max_attempts ` at this client count) — the number reads directly off the tallest
69+ spike the strip already draws (spotlight number == visible fact). ** Total calls**
70+ during the outage is a secondary, un-spotlighted counter (volume story). "The flat
71+ rate leaves the backend room to recover" is the qualitative closing beat, * not* a
72+ spotlighted stat — httpware's code models no backend-recovery dynamic, so no invented
73+ recovery number. ~ 4 beats: outage hits → naive's first clustered spike → httpware
74+ stays flat (jitter + the ` max_attempts ` cap) → peak-multiplier payoff.
6975
7076** Enrich pass.**
7177
@@ -103,11 +109,11 @@ size. Jagged failure shape is one `demos.css` change.
103109` node --check docs/demos/engine.js ` . Scratchpad jsdom harnesses extended: the
104110existing ` verify-demos.js ` / ` verify-real-page.js ` drive every stop including the new
105111herd mini-tour to completion without stalling; a herd trace asserts naive peak
106- multiplier ≫ httpware peak (dramatic gap) and that both lanes use the shared retry +
107- budget models. Manual: retry page reads micro → macro top-to-bottom under
108- mkdocs-material light and dark; countdown ring animates and empties on retry / CB /
109- timeout; failure shape distinguishable in grayscale; ` prefers-reduced-motion `
110- degrades to stepped updates.
112+ multiplier ≫ httpware peak (dramatic gap, ~ 70× vs ~ 3×), httpware bounded near the
113+ ` max_attempts ` cap, and a fine bucket count for a smooth strip. Manual: retry page
114+ reads micro → macro top-to-bottom under mkdocs-material light and dark; countdown
115+ ring animates and empties on CB / timeout; failure shape distinguishable in
116+ grayscale; ` prefers-reduced-motion ` degrades to stepped updates.
111117
112118## Risk
113119
0 commit comments