Documentation
¶
Overview ¶
Package sim provides d-raft's deterministic, single-threaded discrete-event simulation runtime for testing distributed systems.
Time advances only when Simulator executes an event. The package never starts a goroutine and never waits on wall-clock time. Events scheduled for the same instant execute in scheduling order. Rand provides package-owned reproducible random streams, and Router provides a typed network with latency, loss, endpoint lifecycle, and directed partitions.
Components can write their transitions to a shared JSONLRecorder. The resulting versioned JSON Lines stream gives scheduler, random, network, and protocol activity one global observational order. Exact execution replay is driven separately by the semantic choices in package decision.
Index ¶
- Constants
- Variables
- func CloneBytes(message []byte) []byte
- type Action
- type CanonicalLinkState
- type CanonicalRouteState
- type Clock
- type CloneFunc
- type DropReason
- type EventID
- type EventKind
- type EventTag
- type Handler
- type JSONLRecorder
- type LinkConfig
- type NetworkDecisionSource
- type NetworkEvent
- type NetworkEventKind
- type NodeID
- type Observer
- type Packet
- type PacketEventTagger
- type PartitionMatrix
- type PendingEventState
- type Rand
- func (r *Rand) Chance(p float64) bool
- func (r *Rand) Duration(min, max time.Duration) time.Duration
- func (r *Rand) Float64() float64
- func (r *Rand) IntN(n int) int
- func (r *Rand) SetTraceSink(sink TraceSink, stream string)
- func (r *Rand) Split() *Rand
- func (r *Rand) State() RandState
- func (r *Rand) Uint64() uint64
- func (r *Rand) Uint64N(n uint64) uint64
- type RandState
- type Router
- func (r *Router[M]) CanonicalState() (RouterState, error)
- func (r *Router[M]) Register(node NodeID, handler Handler[M]) error
- func (r *Router[M]) ResetLink(from, to NodeID)
- func (r *Router[M]) Send(from, to NodeID, message M) (SendResult, error)
- func (r *Router[M]) SetDecisionSource(source NetworkDecisionSource[M])
- func (r *Router[M]) SetLink(from, to NodeID, config LinkConfig) error
- func (r *Router[M]) SetObserver(observer Observer[M])
- func (r *Router[M]) SetPacketEventTagger(tagger PacketEventTagger[M])
- func (r *Router[M]) SetPartition(matrix *PartitionMatrix)
- func (r *Router[M]) SetTraceSink(sink TraceSink)
- func (r *Router[M]) Unregister(node NodeID) bool
- type RouterState
- type SendResult
- type Simulator
- func (s *Simulator) Cancel(id EventID) bool
- func (s *Simulator) CanonicalState() (SimulatorState, error)
- func (s *Simulator) Clock() *Clock
- func (s *Simulator) Len() int
- func (s *Simulator) NextEventTime() (time.Duration, bool)
- func (s *Simulator) Now() time.Duration
- func (s *Simulator) Run() int
- func (s *Simulator) RunSteps(limit int) int
- func (s *Simulator) RunUntil(end time.Duration) (int, error)
- func (s *Simulator) Schedule(delay time.Duration, action Action) (EventID, error)
- func (s *Simulator) ScheduleAt(when time.Duration, action Action) (EventID, error)
- func (s *Simulator) ScheduleAtTagged(when time.Duration, tag EventTag, action Action) (EventID, error)
- func (s *Simulator) ScheduleTagged(delay time.Duration, tag EventTag, action Action) (EventID, error)
- func (s *Simulator) SetTraceSink(sink TraceSink)
- func (s *Simulator) Step() bool
- type SimulatorState
- type TraceEvent
- type TraceEventKind
- type TraceFunc
- type TraceLinkConfig
- type TraceRecord
- type TraceRoute
- type TraceSink
Examples ¶
Constants ¶
const CanonicalStateSchema = "d-raft.sim-state/v1"
const RouterStateSchema = "d-raft.router-state/v1"
const TraceSchemaVersion = "d-raft.trace/v1"
TraceSchemaVersion identifies the JSON Lines trace format emitted by JSONLRecorder. It is versioned independently from the Go module.
Variables ¶
var ( ErrNilSimulator = errors.New("sim: router requires a simulator") ErrNilRand = errors.New("sim: router requires a random source") ErrEmptyNode = errors.New("sim: node identifier must not be empty") ErrNilHandler = errors.New("sim: node handler must not be nil") ErrDuplicateNode = errors.New("sim: node is already registered") ErrUnknownSource = errors.New("sim: packet source is not registered") ErrUnknownTarget = errors.New("sim: packet target is not registered") ErrInvalidLink = errors.New("sim: invalid network link configuration") ErrInvalidMatrix = errors.New("sim: invalid partition matrix") ErrPacketExhausted = errors.New("sim: packet identifier space exhausted") ErrInvalidNetworkDecision = errors.New("sim: invalid network decision") ErrUncacheableRouter = errors.New("sim: router state is not canonically inspectable") )
var ( // ErrNegativeTime is returned when an operation is given negative virtual // time or a negative delay. ErrNegativeTime = errors.New("sim: virtual time and delays must not be negative") // ErrPast is returned when an operation would move virtual time backwards. ErrPast = errors.New("sim: cannot schedule or advance into the past") // ErrTimeOverflow is returned when adding a delay would overflow a // time.Duration. ErrTimeOverflow = errors.New("sim: virtual time overflow") // ErrEventIDExhausted is returned in the practically unreachable case that // all uint64 event identifiers have been allocated. ErrEventIDExhausted = errors.New("sim: event identifier space exhausted") // ErrUncacheableState reports hidden callback or trace-sink behavior. ErrUncacheableState = errors.New("sim: state is not canonically inspectable") // ErrInvalidEventTag reports a malformed canonical callback descriptor. ErrInvalidEventTag = errors.New("sim: invalid event tag") )
Functions ¶
func CloneBytes ¶
CloneBytes returns an independent copy of a byte slice and is suitable as a Router clone function.
Types ¶
type Action ¶
type Action func(*Simulator)
Action is invoked synchronously when an event reaches the front of the queue. It may schedule or cancel other events.
type CanonicalLinkState ¶
type CanonicalRouteState ¶
type Clock ¶
type Clock struct {
// contains filtered or unexported fields
}
Clock exposes the current virtual time. It has no wall-clock behavior.
type CloneFunc ¶
type CloneFunc[M any] func(M) M
CloneFunc snapshots a message when Send is called. A nil CloneFunc performs assignment, which is sufficient for immutable messages and value types.
type DropReason ¶
type DropReason uint8
DropReason explains why a packet was discarded.
const ( NotDropped DropReason = iota DropLoss DropPartition )
type EventID ¶
type EventID uint64
EventID identifies a pending event. The zero value is never issued.
type EventKind ¶
type EventKind string
EventKind identifies the closed set of callbacks used by the reference experiment executor. EventTag data is a canonical JSON value whose schema is owned by the producer of that kind.
const ( EventNetworkDelivery EventKind = "network_delivery" EventStorageCompletion EventKind = "storage_completion" EventPersistenceAck EventKind = "persistence_ack" EventElectionTimer EventKind = "election_timer" EventHeartbeatTimer EventKind = "heartbeat_timer" EventExternalAction EventKind = "external_action" EventScheduledCrash EventKind = "scheduled_crash" EventScheduledRestart EventKind = "scheduled_restart" )
type EventTag ¶
type EventTag struct {
Kind EventKind `json:"kind"`
Data json.RawMessage `json:"data"`
}
EventTag is the inspectable semantic replacement for an opaque callback.
type JSONLRecorder ¶
type JSONLRecorder struct {
// contains filtered or unexported fields
}
JSONLRecorder writes one TraceRecord per line. It is intentionally synchronous and is not safe for concurrent use. After the first encoding error it records no further events; Err reports that error.
func NewJSONLRecorder ¶
func NewJSONLRecorder(writer io.Writer) *JSONLRecorder
NewJSONLRecorder returns a recorder that writes to writer.
func (*JSONLRecorder) Err ¶
func (r *JSONLRecorder) Err() error
Err returns the first JSON encoding or writing error observed by r.
func (*JSONLRecorder) RecordTrace ¶
func (r *JSONLRecorder) RecordTrace(event TraceEvent)
RecordTrace implements TraceSink.
type LinkConfig ¶
type LinkConfig struct {
MinLatency time.Duration
MaxLatency time.Duration
LossProbability float64
}
LinkConfig describes a directed network link. Latency is sampled uniformly in nanoseconds from the inclusive range [MinLatency, MaxLatency].
func (LinkConfig) Validate ¶
func (c LinkConfig) Validate() error
Validate verifies that a link configuration is usable.
type NetworkDecisionSource ¶
type NetworkDecisionSource[M any] interface { Drop(Packet[M], LinkConfig) (bool, error) Latency(Packet[M], LinkConfig) (time.Duration, error) }
NetworkDecisionSource replaces Router's random loss and latency draws with semantic decisions suitable for recording, replay, and exploration.
type NetworkEvent ¶
type NetworkEvent[M any] struct { Kind NetworkEventKind Packet Packet[M] At time.Duration DeliveryAt time.Duration Reason DropReason WasInFlight bool }
NetworkEvent is emitted synchronously by a Router. DeliveryAt is set for a scheduled delivery and for a packet dropped when delivery became due. Reason is set for a drop, and WasInFlight distinguishes a delivery-time drop from one decided by Send (including when virtual time is zero).
type NetworkEventKind ¶
type NetworkEventKind uint8
NetworkEventKind describes an observable router transition.
const ( PacketScheduled NetworkEventKind = iota + 1 PacketDelivered PacketDropped )
type Observer ¶
type Observer[M any] func(NetworkEvent[M])
Observer sees packet lifecycle transitions. It runs inline and may affect scheduling order, so observers used for tracing should avoid side effects.
type Packet ¶
Packet is a message in transit. Packet values delivered to handlers and observers must be treated as read-only.
type PacketEventTagger ¶
PacketEventTagger encodes the semantic payload captured by an in-flight delivery callback. Reference explorers install one; generic routers may continue using opaque callbacks.
type PartitionMatrix ¶
type PartitionMatrix struct {
// contains filtered or unexported fields
}
PartitionMatrix is an immutable directed connectivity matrix. A true cell permits traffic; false blocks it. Nodes absent from a matrix are isolated while that matrix is active.
func NewPartitionMatrix ¶
func NewPartitionMatrix(nodes []NodeID, allowed [][]bool) (*PartitionMatrix, error)
NewPartitionMatrix builds a matrix whose row and column order is nodes. allowed must be a square len(nodes)-by-len(nodes) matrix.
func NewPartitions ¶
func NewPartitions(groups ...[]NodeID) (*PartitionMatrix, error)
NewPartitions constructs a symmetric matrix from disjoint connectivity groups. Nodes in the same group can communicate in both directions; nodes in different groups cannot. Every node must occur exactly once.
func (*PartitionMatrix) Allows ¶
func (m *PartitionMatrix) Allows(source, target NodeID) bool
Allows reports whether traffic from source to target is permitted.
func (*PartitionMatrix) Nodes ¶
func (m *PartitionMatrix) Nodes() []NodeID
Nodes returns a copy of the matrix's node order.
type PendingEventState ¶
type PendingEventState struct {
ID EventID `json:"id"`
AtNS int64 `json:"at_ns"`
Order uint64 `json:"order"`
Tag EventTag `json:"tag"`
}
PendingEventState is one future callback in execution order.
type Rand ¶
type Rand struct {
// contains filtered or unexported fields
}
Rand is a small, deterministic pseudo-random number generator.
Rand uses SplitMix64. Its output is deliberately implemented in this package, rather than delegated to a standard-library generator whose stream may change between Go releases. A seed therefore reproduces the same stream on every supported platform and package version.
Rand is intended for simulation, randomized testing, and deriving independent simulation streams. It is not cryptographically secure.
func NewRand ¶
NewRand returns a generator initialized with seed. Every uint64 value, including zero, is a valid seed.
func (*Rand) Chance ¶
Chance reports whether an event with probability p occurs. It panics when p is outside [0, 1] or is NaN.
func (*Rand) Duration ¶
Duration returns a uniformly distributed duration in the inclusive range [min, max]. It panics if min is negative or max is less than min.
func (*Rand) IntN ¶
IntN returns a uniformly distributed value in [0, n). It panics if n is not positive.
func (*Rand) SetTraceSink ¶
SetTraceSink sets the synchronous trace destination and stream label. Empty labels are recorded as "default". Child generators created by Split inherit the sink and receive stable labels below this stream.
func (*Rand) Split ¶
Split derives a deterministic child stream. Calling Split consumes one value from r, so stream allocation order is significant.
type Router ¶
type Router[M any] struct { // contains filtered or unexported fields }
Router is a deterministic, directed, in-memory network. It performs all work through its Simulator and never starts goroutines.
Example ¶
package main
import (
"fmt"
"time"
sim "github.com/aminkbi/d-raft"
)
func main() {
simulation := sim.New()
random := sim.NewRand(20260814)
router, err := sim.NewRouter(
simulation,
random,
sim.LinkConfig{MinLatency: 10 * time.Millisecond, MaxLatency: 10 * time.Millisecond},
func(message voteRequest) voteRequest { return message },
)
if err != nil {
panic(err)
}
must(router.Register("candidate", func(sim.Packet[voteRequest]) {}))
must(router.Register("voter", func(packet sim.Packet[voteRequest]) {
fmt.Printf("term=%d candidate=%s at=%s\n", packet.Message.Term, packet.From, simulation.Now())
}))
_, err = router.Send("candidate", "voter", voteRequest{Term: 7})
must(err)
simulation.Run()
}
type voteRequest struct {
Term uint64
}
func must(err error) {
if err != nil {
panic(err)
}
}
Output: term=7 candidate=candidate at=10ms
func NewRouter ¶
func NewRouter[M any](simulator *Simulator, random *Rand, defaultLink LinkConfig, clone CloneFunc[M]) (*Router[M], error)
NewRouter constructs a router. Passing nil for clone uses ordinary Go assignment; provide a clone function for slices, maps, pointers, or other mutable messages that senders might modify after Send returns.
func (*Router[M]) CanonicalState ¶
func (r *Router[M]) CanonicalState() (RouterState, error)
CanonicalState returns an independently owned, map-order-independent router checkpoint. Trace sinks and observers are rejected because arbitrary callbacks can introduce hidden side effects.
func (*Router[M]) Send ¶
func (r *Router[M]) Send(from, to NodeID, message M) (SendResult, error)
Send submits a packet to the simulated network.
func (*Router[M]) SetDecisionSource ¶
func (r *Router[M]) SetDecisionSource(source NetworkDecisionSource[M])
SetDecisionSource replaces random network choices. Passing nil restores the Router's Rand-based behavior.
func (*Router[M]) SetLink ¶
func (r *Router[M]) SetLink(from, to NodeID, config LinkConfig) error
SetLink overrides the default configuration for a directed link.
func (*Router[M]) SetObserver ¶
SetObserver sets the lifecycle observer. Passing nil disables observation.
func (*Router[M]) SetPacketEventTagger ¶
func (r *Router[M]) SetPacketEventTagger(tagger PacketEventTagger[M])
SetPacketEventTagger makes future delivery callbacks canonically visible. Passing nil restores ordinary opaque simulator callbacks.
func (*Router[M]) SetPartition ¶
func (r *Router[M]) SetPartition(matrix *PartitionMatrix)
SetPartition activates a connectivity matrix. Passing nil restores full connectivity. The matrix is checked both when a packet is sent and when it is due for delivery, so a new partition can cut packets already in flight.
func (*Router[M]) SetTraceSink ¶
SetTraceSink sets the synchronous machine-readable trace destination. Passing nil disables tracing. Use the same sink for the simulator, random source, and router to obtain one globally ordered execution trace.
func (*Router[M]) Unregister ¶
Unregister removes a node and reports whether it existed. Packets already in flight to it will be dropped at delivery time.
type RouterState ¶
type RouterState struct {
Schema string `json:"schema"`
DefaultLink CanonicalLinkState `json:"default_link"`
Links []CanonicalLinkState `json:"links"`
Endpoints []NodeID `json:"endpoints"`
PartitionActive bool `json:"partition_active"`
PartitionNodes []NodeID `json:"partition_nodes"`
Allowed []CanonicalRouteState `json:"allowed"`
NextPacket uint64 `json:"next_packet"`
Exhausted bool `json:"exhausted"`
Random RandState `json:"random"`
}
RouterState contains topology, endpoint, allocation, and random-stream state. In-flight packets are represented by Simulator delivery event tags.
type SendResult ¶
type SendResult struct {
PacketID uint64
Scheduled bool
DeliveryAt time.Duration
DropReason DropReason
}
SendResult reports the immediate outcome of Send.
type Simulator ¶
type Simulator struct {
// contains filtered or unexported fields
}
Simulator is a single-threaded deterministic discrete-event scheduler. Its zero value is ready to use.
Simulator is intentionally not safe for concurrent use. Running it from one OS goroutine makes event execution, random draws, and network delivery fully reproducible.
func (*Simulator) Cancel ¶
Cancel removes a pending event. It reports false if id is zero, unknown, or already executed or canceled.
func (*Simulator) CanonicalState ¶
func (s *Simulator) CanonicalState() (SimulatorState, error)
CanonicalState returns an independent scheduler checkpoint. It refuses to guess the meaning of opaque Action closures.
func (*Simulator) NextEventTime ¶
NextEventTime returns the time of the next event and whether one exists.
func (*Simulator) RunSteps ¶
RunSteps executes at most limit events and returns the number run. A negative limit executes no events.
func (*Simulator) RunUntil ¶
RunUntil executes every event scheduled at or before end, then advances the clock to end. Events scheduled for end by another event at end are also run.
func (*Simulator) ScheduleAt ¶
ScheduleAt adds an action at the specified absolute virtual time. Events at the same time execute in the order in which they were scheduled.
func (*Simulator) ScheduleAtTagged ¶
func (s *Simulator) ScheduleAtTagged(when time.Duration, tag EventTag, action Action) (EventID, error)
ScheduleAtTagged adds an inspectable callback at an absolute virtual time.
func (*Simulator) ScheduleTagged ¶
func (s *Simulator) ScheduleTagged(delay time.Duration, tag EventTag, action Action) (EventID, error)
ScheduleTagged adds an inspectable callback delay after the current time.
func (*Simulator) SetTraceSink ¶
SetTraceSink sets the synchronous machine-readable trace destination. Passing nil disables tracing.
type SimulatorState ¶
type SimulatorState struct {
Schema string `json:"schema"`
NowNS int64 `json:"now_ns"`
NextID EventID `json:"next_id"`
Exhausted bool `json:"exhausted"`
Events []PendingEventState `json:"events"`
}
SimulatorState contains every future-relevant scheduler field. Events are sorted by execution order rather than heap layout.
type TraceEvent ¶
type TraceEvent struct {
Kind TraceEventKind `json:"kind"`
AtNS *int64 `json:"at_ns,omitempty"`
EventID EventID `json:"event_id,omitempty"`
ScheduledForNS *int64 `json:"scheduled_for_ns,omitempty"`
RandomStream string `json:"random_stream,omitempty"`
RandomOperation string `json:"random_operation,omitempty"`
RandomArguments map[string]string `json:"random_arguments,omitempty"`
RandomResult string `json:"random_result,omitempty"`
PacketID uint64 `json:"packet_id,omitempty"`
From NodeID `json:"from,omitempty"`
To NodeID `json:"to,omitempty"`
Message any `json:"message,omitempty"`
DeliveryAtNS *int64 `json:"delivery_at_ns,omitempty"`
DropReason string `json:"drop_reason,omitempty"`
Component string `json:"component,omitempty"`
Action string `json:"action,omitempty"`
Details any `json:"details,omitempty"`
Node NodeID `json:"node,omitempty"`
Link *TraceLinkConfig `json:"link,omitempty"`
PartitionActive *bool `json:"partition_active,omitempty"`
PartitionNodes []NodeID `json:"partition_nodes,omitempty"`
PartitionAllowed []TraceRoute `json:"partition_allowed,omitempty"`
}
TraceEvent is an event before it is assigned a schema version and sequence number by a recorder. Fields irrelevant to Kind are omitted from JSON. Message must be JSON-encodable when the event is sent to JSONLRecorder.
type TraceEventKind ¶
type TraceEventKind string
TraceEventKind identifies a deterministic simulator transition.
const ( TraceEventScheduled TraceEventKind = "event_scheduled" TraceEventCanceled TraceEventKind = "event_canceled" TraceEventExecuted TraceEventKind = "event_executed" TraceClockAdvanced TraceEventKind = "clock_advanced" TraceRandomDraw TraceEventKind = "random_draw" TraceNodeRegistered TraceEventKind = "node_registered" TraceNodeUnregistered TraceEventKind = "node_unregistered" TraceLinkSet TraceEventKind = "link_set" TraceLinkReset TraceEventKind = "link_reset" TracePartitionChanged TraceEventKind = "partition_changed" TracePacketScheduled TraceEventKind = "packet_scheduled" TracePacketDelivered TraceEventKind = "packet_delivered" TracePacketDropped TraceEventKind = "packet_dropped" TraceProtocolInput TraceEventKind = "protocol_input" TraceProtocolState TraceEventKind = "protocol_state" TracePersistence TraceEventKind = "persistence" TraceProcessLifecycle TraceEventKind = "process_lifecycle" TraceProtocolDrop TraceEventKind = "protocol_drop" )
type TraceFunc ¶
type TraceFunc func(TraceEvent)
TraceFunc adapts a function to TraceSink.
func (TraceFunc) RecordTrace ¶
func (f TraceFunc) RecordTrace(event TraceEvent)
RecordTrace calls f(event).
type TraceLinkConfig ¶
type TraceLinkConfig struct {
MinLatencyNS int64 `json:"min_latency_ns"`
MaxLatencyNS int64 `json:"max_latency_ns"`
LossProbability float64 `json:"loss_probability"`
}
TraceLinkConfig is the stable, nanosecond-based trace representation of a LinkConfig.
type TraceRecord ¶
type TraceRecord struct {
Schema string `json:"schema"`
Sequence uint64 `json:"sequence"`
TraceEvent
}
TraceRecord is one versioned, globally ordered machine-readable record.
type TraceRoute ¶
TraceRoute is one permitted directed route in a partition trace event.
type TraceSink ¶
type TraceSink interface {
RecordTrace(TraceEvent)
}
TraceSink consumes trace events synchronously. Implementations must not call back into the component producing an event because doing so can change deterministic scheduling order.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package apporacle implements a versioned, Raft-independent application commitment for portable cross-adapter experiments.
|
Package apporacle implements a versioned, Raft-independent application commitment for portable cross-adapter experiments. |
|
Package artifact defines d-raft's self-describing, versioned run artifact.
|
Package artifact defines d-raft's self-describing, versioned run artifact. |
|
Package check implements independent, history-aware Raft safety checkers.
|
Package check implements independent, history-aware Raft safety checkers. |
|
cmd
|
|
|
draft
command
|
|
|
draft-eval
command
Command draft-eval runs the bounded d-raft comparative evaluation.
|
Command draft-eval runs the bounded d-raft comparative evaluation. |
|
draft-mutants
command
Command draft-mutants executes a pinned mutant corpus and writes strict JSON.
|
Command draft-mutants executes a pinned mutant corpus and writes strict JSON. |
|
Package decision defines semantic choices, seeded selection, recording, and exact tape replay for deterministic distributed-system executions.
|
Package decision defines semantic choices, seeded selection, recording, and exact tape replay for deterministic distributed-system executions. |
|
Package evaluation runs the bounded, repeated empirical comparison shipped with d-raft.
|
Package evaluation runs the bounded, repeated empirical comparison shipped with d-raft. |
|
Package experiment executes versioned scenarios against d-raft adapters.
|
Package experiment executes versioned scenarios against d-raft adapters. |
|
Package explore performs bounded depth-first exploration by clean prefix reruns over semantic choices.
|
Package explore performs bounded depth-first exploration by clean prefix reruns over semantic choices. |
|
internal
|
|
|
strictjson
Package strictjson provides lexical checks that encoding/json's typed decoder does not perform itself.
|
Package strictjson provides lexical checks that encoding/json's typed decoder does not perform itself. |
|
Package minimize reduces scenarios and semantic guidance while preserving a specific independently checked violation fingerprint.
|
Package minimize reduces scenarios and semantic guidance while preserving a specific independently checked violation fingerprint. |
|
Package mutant executes a versioned, repository-pinned corpus of source mutants.
|
Package mutant executes a versioned, repository-pinned corpus of source mutants. |
|
Package raft implements d-raft's deterministic reference Raft state machine.
|
Package raft implements d-raft's deterministic reference Raft state machine. |
|
Package raftsim integrates the pure Raft reference model with d-raft's deterministic scheduler, network, storage, timers, and process lifecycle.
|
Package raftsim integrates the pure Raft reference model with d-raft's deterministic scheduler, network, storage, timers, and process lifecycle. |
|
Package semanticplan projects adapter-neutral semantic directives onto adapter-local decision streams.
|
Package semanticplan projects adapter-neutral semantic directives onto adapter-local decision streams. |
|
Package trace decodes and validates d-raft's observational JSON Lines trace without converting full-width protocol integers through float64.
|
Package trace decodes and validates d-raft's observational JSON Lines trace without converting full-width protocol integers through float64. |