Task · CFO-0068

HTTP zone metrics fail every cycle with duplicate host groups in the latency query

Description

Since the 0.10.0 deploy on 2026-10-01 the httpreq.metrics collector has succeeded once (its first cycle) and failed every five-minute cycle after it with “HTTP latency query returned duplicate host groups” (internal/collectors/httpreq/latency.go). The request, bytes, breakdown and latency series have had no new data since; 0.10.1 has never recorded a success for this collector. Loop 14’s live proof read the series created by that single first cycle and passed. A fifteen-minute live read of host groups with the collector’s eyeball filter showed no two raw host values collapsing to one normalised host, so normalisation is not the proven cause; the leading unproven hypothesis is that the GraphQL client concatenates one row set per maxDuration sub-window when a retained checkpoint makes the window longer than one sub-window, which also explains why the failure is self-sustaining.

Acceptance Criteria

Definition of Done

Implementation Plan

Loop15 implementation follows the frozen lane packet; assertion-based red witness, local just check and CodeRabbit, independent REV where required, root linear landing and sustained live evidence where applicable.

Implementation Notes

Cause proven live at loop 15 preparation (2026-10-01, runtime token, eyeball filter): the dataset returns the raw Host header, so a client sending name:port creates a second source group that normalises to the same host. Over ten hours 4 of 23 zones had such groups (17 port-suffixed groups with 31 requests beside 7 canonical groups with 3,239), one zone inside a single five-minute window. The sub-window hypothesis in the description is wrong: maxDuration is 30 days on every zone, so the client never splits these windows.

Loop16 RECON-M1 checked source criteria 1,2,3 against landed tests at ced4edfbfb66f1b9ee45037bdb425b69820a8ebe. Evidence: codex/evidence-loop16/RECON-return.txt. No new live or browser observation is claimed.

Loop16 HOUR-0 sole retry passed on unchanged running version 0.13.0: 14 reads across 3900 seconds, all49collector attempts equal successes, one instance, no counter reset, ages bounded, no query errors. Receipt codex/live-loop16/hour-0-retry.json. The initial proof failed on a real Durable Objects poll and remains retained in hour-0.json; no error series was required. All source ACs previously reconciled. Live AC4 checked, task Done.

View the source file on GitHub