f6c3f7c593
Second pass on the 0.4.1 image, from a clean start with zero denial warnings on central-a. Both auth negatives are still refused with a byte-identical Unauthenticated status and detail - 0.4.1 changed what the server writes down, not what a caller sees - and the no-bearer call now produces a WRN in the same second it is refused, with the cause attributed. No interval has to elapse for the first denial to be visible, which is the whole point: a follower with a mis-rotated token is refused on every sweep, and central now says so immediately. The rate limit was proven to DEFER rather than drop, not assumed to. The wrong-bearer call one second later fell inside the 60 s window and produced no line of its own; the window was waited out and one further wrong-bearer call issued, whose summary reported TWO wrong-credential denials - the deferred one plus the new one. Summing the two lines gives exactly the three negatives issued, correctly attributed by cause. N is a per-window delta, so a reader must sum the lines rather than quote the last one; that is recorded as a follow-up because it is the kind of thing an alert gets wrong. Log hygiene re-run fleet-wide and widened: all eight nodes' docker logs and every on-disk Serilog file were grepped for the dev token, the dev KEK, all three secret plaintexts AND both wrong tokens the negatives presented. Zero hits everywhere. The presented-credential check is deliberate - echoing a rejected credential back into a log is its own leak and a free oracle, and the new warning counts denials by cause without carrying any credential material. Checks 2 and 3 were not repeated: 0.4.1 touches the hub's denial logging and nothing else - no wire change, no store change, no sweep change. Convergence was re-smoked instead so the new image is not merely assumed to replicate: a fresh secret reached both followers in 17 s, byte-identical and decrypt-verified on both, and the first pass's live secret and tombstone survived the image swap unchanged on all three nodes. The first-pass FAIL evidence is kept intact rather than overwritten. The fix only means anything against the failure it answers, and a gate doc that shows only the green run cannot be audited. Residuals stand as recorded: the hub client dials a single endpoint with no failover, and the central pair does not converge with itself - central-b answered an authenticated GetManifest with an empty manifest for the whole run. Those are one question, not two. 4/4. Merging. Claude-Session: https://claude.ai/code/session_014WNM4vjoVksyyBraTXSZE1