v0.4.4
Fixed
-
TTFT-watchdog retry path: reset
startedAton retry: when the
TTFT watchdog fired and a same-key or rewrite-escalation retry
succeeded, the recordedttft_msandduration_msincluded the
watchdog timeout (60s) + cooldown (30s) + real upstream TTFT because
ctx.startedAtwas set once at request entry and never reset. The
proxy now resetsctx.startedAt = Date.now()immediately before each
retryreturn { continue: true }inhandleTtftTimeout, so the
downstreamrequestStartedAtplumbing reads the successful attempt's
start. Verified: capture 20561 showedttft_ms=127153(real TTFT
~37s) pre-fix; post-fix retry-succeeded captures reportttft_ms < 60000. -
TTFT-watchdog retry path: record incident on success-after-retry:
the success-after-retry path calledttftState.recordRetryOutcome(true)
andgate.recordSuccess()but neverdb.recordIncident(...), so the
incidentstable stayed empty even though the watchdog fired and the
proxy deliberately cut the connection, cooled down, and retried. The
terminal 504/499 paths already recorded incidents viaqueueTtftTimeout;
the success path now records attft_timeoutincident with
responsible_party="proxy",served_status=200, and
reason="TTFT watchdog fired; retry succeeded"so every watchdog firing
is auditable.