HotStuff And Pacemaker

This page summarizes the current HotStuff runtime that ships in sigilaris-node-jvm.

Current Baseline

Runtime Boundary

The runtime page is intentionally separate from the transport page:

That split is important because the current repository treats HotStuff logic as runtime-owned, while transport remains an adapter layer.

Application Proposal Input

Autonomous pacemaker proposal emission is no longer limited to synthetic empty blocks. Embedders can pass a HotStuffProposalInputRuntimeConfig to the in-memory runtime helper or the assembled bootstrap entrypoints. The configured HotStuffProposalInputProvider receives HotStuff context only: window, proposer, parent, height, justify QC, local time, and proposal bounds.

The provider returns a HotStuffProposalInput containing the proposal tx-set and block-header commitments that Sigilaris can sign. Application-specific queues, lanes, manifests, and fairness rules stay outside sigilaris-node-jvm; embedders adapt those concepts to the HotStuff-owned input contract.

Legacy empty proposals remain available through the explicit AllowLegacyEmpty fallback policy. Production embedders that require application input can select RequireProviderInput; automatic consensus then fails visibly when no provider is configured and suppresses fallback when the provider reports no work, rejection, or failure.

Provider no-work, rejection, failure, invalid input, and fallback behavior are recorded in pacemaker diagnostics as reason/detail metadata with a fallbackUsed flag. Diagnostics intentionally do not include application payload bodies. Unexpected provider exceptions use the exception class name as detail, not the exception message.

Application Proposal Validation

Proposal validation is separate from proposal input. The input provider is used only when the local node is the leader and needs proposal body data. The validation provider is used when a node is about to sign a local vote for a received proposal.

Embedders can pass a HotStuffProposalValidationRuntimeConfig to HotStuffNodeRuntime or the assembled bootstrap entrypoints. The configured HotStuffProposalValidationProvider receives HotStuff context only: the proposal, local voter, validation time, and validator set. It returns Accepted, Rejected, Unavailable, or Failed.

Rejected, unavailable, failed, or missing-required validation never signs a local proposal vote. legacyCompatible keeps the previous allow-all behavior. Production embedders can select requireProvider(provider) or requireValidationProvider; automatic consensus fails fast if validation is required but no provider is configured.

Validation diagnostics are recorded in pacemaker snapshots with window, proposal id, block id, local voter, outcome, reason/detail, and whether the vote was suppressed. Proposal payload bodies are not included. Structural artifact retention stays in the HotStuff sink: a structurally valid proposal can remain retained even when local application validation suppresses a vote.

Current Limitations

Follow-Up Work