feat(seinodetask): GovParamChange kind (PLT-487)#405
Conversation
Adds the GovParamChange SeiNodeTask kind — submits a ParameterChangeProposal through the controller → seictl gov-param-change sidecar task, operator-key signed, closing the last governance step done out-of-band. - CRD: GovParamChangePayload + GovParamChangeEntry; changes[].value is apiextensionsv1.JSON (x-kubernetes-preserve-unknown-fields) so any JSON shape (scalar/string/bool/object) is accepted and forwarded as RAW bytes — the sidecar does the single string() conversion, structurally preventing the prop-252 double-encode-at-apply bug. - CEL: extend exactly-one-payload union, kind↔payload binding, enum. - Dispatch: govParamChangeParams maps the payload to sidecar.GovParamChangeTask (Value as json.RawMessage from .Raw), KeyName via resolveSigningUID. - Outputs: GovParamChangeOutputs defined for shape-consistency, UNPOPULATED (chain-as-medium; no TaskResult output channel) — matches the other gov kinds. - Bumps seictl to the gov-param-change build. - Tests: unit (mapper, value single-encode for object+scalar shapes, keyName derivation, nil-payload ParamsBuildFailed) + envtest (CEL accept/reject, value-accepts-any-JSON byte-identical round-trip, MinItems/MinLength, kind-immutable). make manifests generate committed. isExpedited deferred (honored only via NewMsgSubmitProposalWithExpedite); generic GovSubmitProposal deferred (permission-boundary: per-kind admission policy is cleanly expressible, an opaque generic payload is not). Design: bdchatham-designs designs/wave/seinode-govparamchange-submit-proposal.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PR SummaryHigh Risk Overview The CRD/API layer introduces Controller wiring maps the CR to Coverage includes unit tests (mapping, single-encode regression, deserialize round-trip) and envtest CEL/admission tests. Reviewed by Cursor Bugbot for commit e68d0b9. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 025c9b3. Configure here.
… (review) CRITICAL: task.go's registry omitted sidecar.TaskTypeGovParamChange, so Deserialize would return UnknownTaskTypeError and every GovParamChange task would fail terminally (DeserializeFailed) before reaching the sidecar — the kind was wired into the switch but dead on the execution path (same class as the seictl sign-tx registry miss). Add the entry (false = submit-and-poll, like the other gov kinds). Tests: add a Deserialize round-trip test (the guard that would have caught this) and a multi-entry changes test (order + per-element raw-value preservation).

Adds the
GovParamChangeSeiNodeTask kind — submits aParameterChangeProposalthrough the controller → seictlgov-param-changesidecar task (operator-key signed), closing the only governance step still done out-of-band (the arctic-1 prop-252 flow).Key decision —
valueasapiextensionsv1.JSON:changes[].valueaccepts any JSON shape (scalar/string/bool/object) viax-kubernetes-preserve-unknown-fields, and the controller forwards the raw bytes; the sidecar does the singlestring()conversion. This structurally prevents the double-encode-at-apply bug that burned the deposit on prop-252's first draft.govParamChangeParams→sidecar.GovParamChangeTask,KeyNameviaresolveSigningUID.GovParamChangeOutputsdefined for shape-consistency but unpopulated (chain-as-medium, like the other gov kinds).gov-param-changebuild (re-pin to the tagged release once cut).Deferred:
isExpedited(honored only viaNewMsgSubmitProposalWithExpedite); genericGovSubmitProposal— per-kind admission policy is cleanly expressible, an opaque generic payload is not (RBAC/permission-boundary; see design).Design (Coral-signed-off + Brandon-approved):
bdchatham-designs designs/wave/seinode-govparamchange-submit-proposal.md. Pairs with the merged seictl PR #203. Closes PLT-487.🤖 Generated with Claude Code