Skip to content

feat(nodetask): surface terminal InclusionUnverifiable gov outcome#495

Draft
bdchatham wants to merge 1 commit into
mainfrom
fix/gov-inclusion-unverifiable
Draft

feat(nodetask): surface terminal InclusionUnverifiable gov outcome#495
bdchatham wants to merge 1 commit into
mainfrom
fix/gov-inclusion-unverifiable

Conversation

@bdchatham

Copy link
Copy Markdown
Collaborator

Draft — blocked on sei-protocol/seictl#237. This consumes the new wire.InclusionUnverifiable enum member added there. It will not compile against the pinned seictl v0.0.64; land order is: merge + release seictl#237, then go get github.com/sei-protocol/seictl@<tag> + go mod tidy here, then mark ready. CI is red until that bump. Validated locally against the seictl branch (build + gov reconcile tests pass).

What

Handle the new terminal gov inclusion state wire.InclusionUnverifiable in handleFailure: a gov tx that was broadcast and accepted at CheckTx but whose on-chain outcome cannot be confirmed because the target node's tx index is disabled (tx_index.indexer = "null").

  • New case wire.InclusionUnverifiablepopulateGovOutputs + markFailed(reason: "InclusionUnverifiable"). Terminal (retrying the same node is futile), mirroring the adjacent CommittedFailed case.
  • Distinct from TxFailed: the tx may have committed, so the reason + the sidecar's message steer the operator to verify out-of-band before re-running. This matters most for GovSoftwareUpgrade, where re-running a "Failed" task does not unschedule an on-chain upgrade.
  • status.outputs carries the txHash for that manual check; height/proposalId are genuinely unknown and omitted (never asserted as 0).

Why

Without this case, an unverifiable result falls through to the generic TaskFailed reason with no structured outputs — the operator loses the txHash and the distinct signal. (Before the seictl fix, this class didn't terminalize at all — it retried to the task timeout and surfaced an opaque Timeout.)

Tests

TestReconcile_GovUpgrade_Unverifiable (mirrors TestReconcile_GovUpgrade_CommittedFailed): asserts Phase=Failed, reason=InclusionUnverifiable, txHash surfaced, height/proposalId zero, and no Ready latch (unverifiable is not success). Status/condition level only.

Review

Reviewed by kubernetes-specialist + idiomatic-reviewer: phase/reason/naming/nil-safety confirmed conforming; the "verify-first" nuance was placed on the seictl sentinel message (single source) and the handleFailure doc comment updated to enumerate the outcome.

Depends on sei-protocol/seictl#237.

🤖 Generated with Claude Code

Handle the new wire.InclusionUnverifiable inclusion state in handleFailure:
a gov tx that was broadcast and accepted at CheckTx but whose on-chain
outcome cannot be confirmed because the target node's tx index is off.

Terminal (retrying the same node is futile) but distinct from TxFailed —
the tx may have committed, so the reason (InclusionUnverifiable) and the
sidecar message steer the operator to verify out-of-band rather than blindly
re-run (important for GovSoftwareUpgrade, where a rollback does not unschedule
an on-chain upgrade). status.outputs still carries the txHash for that check;
height/proposalId are genuinely unknown and omitted.

Depends on the wire enum addition in seictl (sei-protocol/seictl#237): this
will not compile until seictl is released with InclusionUnverifiable and this
module's seictl dependency is bumped. Validated locally against that branch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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