Build1 distinct publisher3 min readPublished
Rubick's node drain fell back to a plain DELETE whenever an eviction errored, and the dialog on screen was busy explaining how kubectl waits on a PodDisruptionBudget. Its maintainer thinks the missing third verdict is the deeper defect.
The Engineer · Build desk

build
Argo CD's "Healthy" means the YAML landed, not that checkout works1 distinct publisher
build
Kubernetes spreads pods where it likes; a few manifest lines and some arithmetic decide the rest1 distinct publisher
build
A missing dependsOn hands Flux a GatewayClass before the CRD that defines it1 distinct publisher
build
SSE in Go breaks twice before your handler runs: an illegal header, then a 30-second timeout1 distinct publisher
Compiled by The EngineerSomething wrong?How this is made
The eviction API is the only door in Kubernetes with the PodDisruptionBudget check behind it, and a plain DELETE checks nothing [3]. Rubick used eviction, then fell back to DELETE whenever eviction returned an error, any error [1]. The flag that enabled the fallback was passed by the UI on every drain [2]. So the better an operator's budget, the more reliably the fallback fired: refusing is what the budget does, the refusal arrives as an error, and the error was the trigger [2][3].
The dialog on screen while that happened told the user the drain would not fail on those pods, that it would wait "and keep waiting until another replica is ready somewhere else" [4]. According to the maintainer, that sentence described kubectl drain accurately, but it had never described his code accurately, since the copy was checked against the API's documented behaviour while the code path it claimed to describe went unread [4].
The fix did not stop the reports. A user on a private overlay network, where there is nowhere external to publish an address, got five working routes rendered red [5][6]. status.addresses is optional in the Gateway API spec, and plenty of implementations never fill it [7]. The instrumented run printed serving: false next to servingKnown: true [8]. Credit where it is due: the model already had a field for exactly this, since servingKnown exists so that a verdict nobody checked does not render as checked [8]. It was set true for a verdict nobody had checked.
Round two was more instructive. After the address fix the routes stayed red, now because Rubick reported that either nothing claimed the gateway's class or the controller was not running, two lines below a screen showing the class claimed by a named controller and the gateway programmed [10]. The controller was there; it just does not write status for routes, which the maintainer notes is normal for the alpha kinds [11].
The ExtensionRef case came from the other direction. Envoy Gateway's direct-response answers from the filter with no backend, and Rubick called that broken [12]. A contributor's patch over-corrected into "none needed", which renders a Kong rate-limit plugin with a forgotten backend as healthy, because ExtensionRef does not say what the filter does [13]. Four lines above that verdict, the same page was already printing that it does not interpret KongPlugin [14]. Two of the three Gateway API misreads carried their own refutation on the same screen [19].
A tool grading whether something is working can land on yes, on no, or on could not see, and that third option is the one most dashboards skip [15]. Absence reads as evidence because an empty list or a missing field has the shape of an answer [16]. Two states are also cheaper to render, since a third one costs another visual treatment and a sentence that admits what the verdict does not cover [17]. The fix put the third state in the type system: blind, a member of TraceStepState, meaning the step could not read its source [18]. My read is that this is the right place for it. A caveat in prose is advisory; a union member has to be handled at every render site, so the cost of honesty lands in code review rather than in someone's issue tracker.
For the number to transfer to your dashboard, nothing about Kubernetes has to be true. The question worth putting to any grading tool is which fields it grades that the spec marks optional [7], and what colour it emits when they are missing. The maintainer's comparison is the part worth sitting with: another Kubernetes UI showed the same cluster as entirely fine, and he argues it had not looked either, it just defaults to green [9]. Green is the cheaper way to be wrong, because nobody files an issue against a tick.
Ranked by verification strength, evidence, and original report placement.
Rubick's node drain fell back to a plain DELETE whenever an eviction returned an error, any error.
The Rubick UI passed the flag that enabled the DELETE fallback on every single drain, so a PodDisruptionBudget would refuse an eviction and the pod was deleted anyway a moment later.
The eviction API is the part of Kubernetes that checks a PodDisruptionBudget, the object that says never take the last healthy replica; a plain DELETE checks nothing.
The dialog displayed during the drain said the drain would not fail on those pods but would wait, and keep waiting until another replica is ready somewhere else; the maintainer says the wording described kubectl drain correctly and the code underneath had never done it.
A week after the fix shipped, a user opened an issue with a screenshot showing his gateway working and his routes carrying traffic while Rubick displayed five of them in red.
The user's setup runs on a private overlay network where the gateway has no external address because there is nowhere external to publish one; Rubick read an empty status.addresses and reported that the gateway had no address yet and traffic had nowhere to arrive.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
First-hand and checkable in kind, unverified in fact
The author is the person who wrote both the bug and the fix, and he shows his work in the artefacts a programmer can least easily fake: the printed line 'state: err | serving: false | servingKnown: true', the widened union type, the surviving test assertion on the word 'filter'. What is missing is anything a reader could open independently — no issue links, no commit or version identifiers, no advisory for a drain that ignored PodDisruptionBudgets, and no dates beyond 'a week later'.
A handful of real users, no scale
Three outside parties appear in the story — someone who read the source and emailed security findings, a user running a private overlay cluster who filed a screenshot issue, and a contributor who sent a patch — which is proof the tool is used but not proof of much use. There are no install counts, stars, downloads or release tags anywhere, and the fixes are described as shipped without a version anyone could pin.
Undersold, especially the security part
This is the rare post-mortem that shortchanges its own headline. A cluster tool that deleted pods a PodDisruptionBudget had just refused to release gets one paragraph and the phrase 'that's a bug on its own' before the author moves on to epistemology; no severity language, no advisory, no 'upgrade now'. The design argument that follows is careful and hedged, and the one place the piece reaches beyond its evidence — the unnamed competitor that 'defaults to green' — is a single sentence in a long piece.
Maintainer marking his own homework, mostly against himself
One voice, and it belongs to the author of the software under discussion — a position that usually bends a story, and here mostly bends it the hard way, since disclosing that your drain bypassed PodDisruptionBudgets is testimony against interest. The tilt shows in two smaller places: a competing UI is dismissed as defaulting to green without being named or examined, and the closing turn recasts a run of embarrassing bugs as a design insight, with the author's own type system as the resolution.
Believable, unconfirmed, single-sourced
The internal detail is consistent enough that invention would be laborious — the states, the flags, the filter line and the test that stayed green all fit together — and the argument is falsifiable by anyone who opens the repository. But nobody has, at least not in our coverage, and the claims that reach outside the author's own code, about how alpha controllers behave and what a rival tool does, are exactly where confirmation is absent.