Skip to content

fix: the update strategy is named for the field, and absence claims nothing (ADR 0048 §2) - #82

Merged
kfeofantov merged 1 commit into
mainfrom
fix/update-strategy-is-not-a-rollout
Aug 28, 2026
Merged

kfeofantov merged 1 commit into
mainfrom
fix/update-strategy-is-not-a-rollout

Conversation

@kfeofantov

Copy link
Copy Markdown
Contributor

Two corrections to ADR 0048 §2, which landed yesterday in #81. Both were found
by running the agent against a real cluster, neither by review.

rollout → update_strategy

Rollout is the kind name of the Argo custom resource, and the agent already
reports it in workload_kind. So a record read like this:

{ "workload_kind": "Rollout", "workload": { "rollout": { … } } }

Two meanings of one word in one object, and the generic English noun is the one
that loses. updateStrategy is Kubernetes' own field name on StatefulSet and
DaemonSet, so it is borrowed rather than invented. The field is unreleased and
no backend exists, so the rename costs nothing today and would be a protocol
migration later — the same argument that applies to deployment_revisions.

The unread marker is removed

It claimed that a workload of a kind the agent does not read has a strategy
the agent failed to read. That is a judgement the agent cannot make: whether an
unknown custom resource updates its replicas is not something it observes, and
this agent reduces rather than concludes (ADR 0004).

Worse, the claim needed a complete list of owner kinds that do not update
themselves, which nobody has. The list omitted Node — static pods are owned by
the Node object — so on this kind cluster every control-plane component was
reported as having an unread strategy:

"workload_kind": "Node", "container": "kube-apiserver",
"workload": { "rollout": { "unread": true } }

On a managed control plane that is invisible; on kubeadm, kops or bare metal it
is four or five false entries per cluster, inflating any "share of the fleet we
could not read" figure with the control plane. Patching the list would have
removed the symptom and kept the unsound construction.

Absence now means the agent did not read a strategy, and claims nothing beyond
that. What separates a Job from an Argo Rollout is workload_kind, which ships
in the record key; what a kind implies is a rendering.

ADR 0048 is corrected in place

The repository's rule is that an accepted ADR's body is immutable and a change
of mind produces a new record. The owner decided to correct 0048 instead, on the
grounds that it was a day old, unreleased, and wrong on arrival. The correction
carries a dated note above §2 so a reader sees that the ground moved rather than
finding a body that never said anything else.

Evidence

make test, make lint, make chart-lint: green.

The defect and its fix, both read from the same kind cluster (Kubernetes
1.36.1) — before:

etcd, kube-apiserver, kube-controller-manager, kube-scheduler
  -> "workload": { "rollout": { "unread": true } }

after:

etcd -> workload block: (absent)
kube-apiserver -> workload block: (absent)
kube-controller-manager -> workload block: (absent)
kube-scheduler -> workload block: (absent)
kindnet (DaemonSet) -> {"update_strategy": {"type": "RollingUpdate", …}}

policy-e2e passes with the renamed field:

shape of .../web: liveness exec every 11s ×4, update strategy RollingUpdate
  100%/0, and the probe command is absent

The unit test now asserts absence for Job, Rollout and Node together —
Node is the regression this PR exists for.

🤖 Generated with Claude Code

https://claude.ai/code/session_011YRKuL97KRndaopfpixrhp

…othing (ADR 0048 §2)

Two corrections to a decision that was a day old, both found by running the
agent against a real cluster rather than by review.

`rollout` is renamed `update_strategy`. `Rollout` is the kind name of the Argo
custom resource, which the agent already reports in `workload_kind`; a record
carrying `workload_kind: Rollout` beside a field called `rollout` put two
meanings of one word in one object. `updateStrategy` is Kubernetes' own field
name on StatefulSet and DaemonSet.

The `unread` marker is removed. It claimed that a workload of an unknown kind
has a strategy the agent failed to read — a judgement the agent cannot make, and
one that needs a complete list of owner kinds that do not update themselves. The
list omitted `Node`, so every static control-plane pod on this kind cluster was
reported as having an unread strategy:

    "workload_kind": "Node", "container": "kube-apiserver",
    "workload": { "rollout": { "unread": true } }

Absence now means the agent did not read a strategy, and nothing more. What
distinguishes a Job from an Argo Rollout is `workload_kind`, which already
ships; what a kind implies is a rendering (ADR 0004).

ADR 0048 §2 is corrected in place with a dated note, per the owner's decision;
`security.md` and `backend-requirements.md` follow.

make test, lint, chart-lint: green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011YRKuL97KRndaopfpixrhp
@kfeofantov
kfeofantov merged commit 6edd9cb into main Aug 28, 2026
3 checks passed
@kfeofantov
kfeofantov deleted the fix/update-strategy-is-not-a-rollout branch August 28, 2026 19:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant