check / check (push) Failing after 0s
The server ran os.Exit at the end of its own goroutine, which raced fx's teardown and could kill the process before reportbuf's OnStop flushed the buffer — losing up to a full flush window of telemetry on every restart, silently and with exit 0. The server now requests shutdown through fx.Shutdowner, so fx runs every OnStop in dependency order. The http.Server is built synchronously in OnStart before the serving goroutine starts, so shutdown can no longer race or nil-deref it; the field is never written and read from two goroutines without a happens-before edge. A listen failure now exits non-zero via fx.ExitCode(1). reportbuf's OnStop is guarded by sync.Once. writeTimeout now exceeds the chi per-request budget, with a comment, so that budget is reachable. Dead startupTime, exitCode, and cancelFunc fields are gone. A new test buffers a report and asserts it reaches disk after the fx lifecycle stops. Model: opus-4-8