{"record":{"id":"f31aa9525496e2ba","repo":"linera-io/linera-protocol","slug":"insufficientroundstrict","errorCode":"InsufficientRoundStrict","errorMessage":"Round number should be greater than {0:?}","messagePattern":"Round number should be greater than (.+?)","errorType":"validation","errorClass":"ChainError","httpStatus":null,"severity":"warning","filePath":"linera-chain/src/manager.rs","lineNumber":328,"sourceCode":"                    ChainError::WrongRound(current_round)\n                );\n                // After the fast round, proposals older than the current round are obsolete.\n                ensure!(\n                    new_round >= current_round,\n                    ChainError::InsufficientRound(new_round)\n                );\n            }\n            Round::SingleLeader(_) | Round::Validator(_) => {\n                // After the first single-leader round, only proposals from the current round are relevant.\n                ensure!(\n                    new_round == current_round,\n                    ChainError::WrongRound(current_round)\n                );\n            }\n        }\n        // The round of our validation votes is only allowed to increase.\n        if let Some(vote) = self.validated_vote() {\n            ensure!(\n                new_round > vote.round,\n                ChainError::InsufficientRoundStrict(vote.round)\n            );\n        }\n        // A proposal that isn't newer than the locking block is not relevant anymore.\n        if let Some(locking_block) = self.locking_block.get() {\n            ensure!(\n                locking_block.round() < new_round,\n                ChainError::MustBeNewerThanLockingBlock(new_block.height, locking_block.round())\n            );\n        }\n        // If we have voted to confirm a block, we may only vote to validate a *different* block\n        // if a validated block certificate justifies it from a round strictly after our\n        // confirmation. The validation vote will then sign the unlocking round `certificate.round`,\n        // and since our confirmation is in an earlier round, the claim \"I have not voted to confirm\n        // a different block in any round at or above the unlocking round\" stays truthful.\n        //\n        // Re-validating the very block we confirmed is also allowed, but the certificate must","sourceCodeStart":310,"sourceCodeEnd":346,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-chain/src/manager.rs#L310-L346","documentation":"The round of a validator's validation votes is only allowed to increase: check_proposed_block rejects any proposal whose round is not strictly greater than the round of the manager's latest validated vote. This keeps signed validation votes monotonic.","triggerScenarios":"A proposal (often conflicting or a duplicate) arrives with round <= validated_vote.round while the manager has already voted to validate a block in that round.","commonSituations":"Two leaders active in the same round; retrying a proposal after the validator already voted on another block in that round; client resubmitting from stale state.","solutions":["Move to a strictly higher round (collect timeout votes/certificates to advance the round) before re-proposing","Drop the conflicting proposal; it cannot be validated at or below the vote round"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"let info = client.chain_info(chain_id).await?;\nif let Some(vote) = info.manager.validated_vote() {\n    if proposal.content.round <= vote.round {\n        // Validation votes only move forward: advance the round first.\n        return advance_round_via_timeouts(&client, chain_id).await;\n    }\n}","typeGuard":"fn is_insufficient_round_strict(e: &ChainError) -> bool {\n    matches!(e, ChainError::InsufficientRoundStrict(_))\n}","tryCatchPattern":null,"preventionTips":["Never resubmit a proposal at or below the round you last voted in","Use leader timeouts to advance rounds before re-proposing conflicting blocks"],"tags":["consensus","round","voting","linera"],"backgroundTag":"consensus-round-mismatch","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}