Home / Input Output / ouroboros-leios
Mar 28, 11-12 PM (0)
Mar 28, 12-1 PM (0)
Mar 28, 1-2 PM (0)
Mar 28, 2-3 PM (0)
Mar 28, 3-4 PM (0)
Mar 28, 4-5 PM (0)
Mar 28, 5-6 PM (0)
Mar 28, 6-7 PM (0)
Mar 28, 7-8 PM (0)
Mar 28, 8-9 PM (0)
Mar 28, 9-10 PM (0)
Mar 28, 10-11 PM (0)
Mar 28, 11-12 AM (0)
Mar 29, 12-1 AM (0)
Mar 29, 1-2 AM (0)
Mar 29, 2-3 AM (0)
Mar 29, 3-4 AM (0)
Mar 29, 4-5 AM (0)
Mar 29, 5-6 AM (0)
Mar 29, 6-7 AM (0)
Mar 29, 7-8 AM (0)
Mar 29, 8-9 AM (0)
Mar 29, 9-10 AM (0)
Mar 29, 10-11 AM (0)
Mar 29, 11-12 PM (0)
Mar 29, 12-1 PM (0)
Mar 29, 1-2 PM (0)
Mar 29, 2-3 PM (0)
Mar 29, 3-4 PM (0)
Mar 29, 4-5 PM (0)
Mar 29, 5-6 PM (0)
Mar 29, 6-7 PM (0)
Mar 29, 7-8 PM (0)
Mar 29, 8-9 PM (0)
Mar 29, 9-10 PM (0)
Mar 29, 10-11 PM (0)
Mar 29, 11-12 AM (0)
Mar 30, 12-1 AM (0)
Mar 30, 1-2 AM (0)
Mar 30, 2-3 AM (0)
Mar 30, 3-4 AM (0)
Mar 30, 4-5 AM (0)
Mar 30, 5-6 AM (0)
Mar 30, 6-7 AM (0)
Mar 30, 7-8 AM (0)
Mar 30, 8-9 AM (2)
Mar 30, 9-10 AM (1)
Mar 30, 10-11 AM (1)
Mar 30, 11-12 PM (0)
Mar 30, 12-1 PM (0)
Mar 30, 1-2 PM (1)
Mar 30, 2-3 PM (1)
Mar 30, 3-4 PM (1)
Mar 30, 4-5 PM (0)
Mar 30, 5-6 PM (0)
Mar 30, 6-7 PM (0)
Mar 30, 7-8 PM (0)
Mar 30, 8-9 PM (0)
Mar 30, 9-10 PM (0)
Mar 30, 10-11 PM (0)
Mar 30, 11-12 AM (0)
Mar 31, 12-1 AM (0)
Mar 31, 1-2 AM (0)
Mar 31, 2-3 AM (0)
Mar 31, 3-4 AM (0)
Mar 31, 4-5 AM (0)
Mar 31, 5-6 AM (0)
Mar 31, 6-7 AM (0)
Mar 31, 7-8 AM (1)
Mar 31, 8-9 AM (3)
Mar 31, 9-10 AM (1)
Mar 31, 10-11 AM (5)
Mar 31, 11-12 PM (1)
Mar 31, 12-1 PM (6)
Mar 31, 1-2 PM (0)
Mar 31, 2-3 PM (1)
Mar 31, 3-4 PM (5)
Mar 31, 4-5 PM (1)
Mar 31, 5-6 PM (0)
Mar 31, 6-7 PM (0)
Mar 31, 7-8 PM (0)
Mar 31, 8-9 PM (0)
Mar 31, 9-10 PM (0)
Mar 31, 10-11 PM (0)
Mar 31, 11-12 AM (0)
Apr 01, 12-1 AM (0)
Apr 01, 1-2 AM (0)
Apr 01, 2-3 AM (0)
Apr 01, 3-4 AM (0)
Apr 01, 4-5 AM (0)
Apr 01, 5-6 AM (0)
Apr 01, 6-7 AM (0)
Apr 01, 7-8 AM (0)
Apr 01, 8-9 AM (0)
Apr 01, 9-10 AM (0)
Apr 01, 10-11 AM (3)
Apr 01, 11-12 PM (4)
Apr 01, 12-1 PM (3)
Apr 01, 1-2 PM (0)
Apr 01, 2-3 PM (3)
Apr 01, 3-4 PM (0)
Apr 01, 4-5 PM (0)
Apr 01, 5-6 PM (0)
Apr 01, 6-7 PM (0)
Apr 01, 7-8 PM (0)
Apr 01, 8-9 PM (0)
Apr 01, 9-10 PM (0)
Apr 01, 10-11 PM (0)
Apr 01, 11-12 AM (0)
Apr 02, 12-1 AM (0)
Apr 02, 1-2 AM (0)
Apr 02, 2-3 AM (0)
Apr 02, 3-4 AM (0)
Apr 02, 4-5 AM (0)
Apr 02, 5-6 AM (0)
Apr 02, 6-7 AM (0)
Apr 02, 7-8 AM (0)
Apr 02, 8-9 AM (0)
Apr 02, 9-10 AM (0)
Apr 02, 10-11 AM (0)
Apr 02, 11-12 PM (0)
Apr 02, 12-1 PM (0)
Apr 02, 1-2 PM (0)
Apr 02, 2-3 PM (0)
Apr 02, 3-4 PM (0)
Apr 02, 4-5 PM (0)
Apr 02, 5-6 PM (0)
Apr 02, 6-7 PM (0)
Apr 02, 7-8 PM (0)
Apr 02, 8-9 PM (0)
Apr 02, 9-10 PM (0)
Apr 02, 10-11 PM (0)
Apr 02, 11-12 AM (0)
Apr 03, 12-1 AM (0)
Apr 03, 1-2 AM (0)
Apr 03, 2-3 AM (0)
Apr 03, 3-4 AM (0)
Apr 03, 4-5 AM (0)
Apr 03, 5-6 AM (0)
Apr 03, 6-7 AM (0)
Apr 03, 7-8 AM (0)
Apr 03, 8-9 AM (0)
Apr 03, 9-10 AM (0)
Apr 03, 10-11 AM (0)
Apr 03, 11-12 PM (0)
Apr 03, 12-1 PM (0)
Apr 03, 1-2 PM (0)
Apr 03, 2-3 PM (0)
Apr 03, 3-4 PM (0)
Apr 03, 4-5 PM (0)
Apr 03, 5-6 PM (0)
Apr 03, 6-7 PM (0)
Apr 03, 7-8 PM (0)
Apr 03, 8-9 PM (0)
Apr 03, 9-10 PM (0)
Apr 03, 10-11 PM (0)
Apr 03, 11-12 AM (0)
Apr 04, 12-1 AM (0)
Apr 04, 1-2 AM (0)
Apr 04, 2-3 AM (0)
Apr 04, 3-4 AM (0)
Apr 04, 4-5 AM (0)
Apr 04, 5-6 AM (0)
Apr 04, 6-7 AM (0)
Apr 04, 7-8 AM (0)
Apr 04, 8-9 AM (0)
Apr 04, 9-10 AM (0)
Apr 04, 10-11 AM (0)
Apr 04, 11-12 PM (0)
44 commits this week Mar 28, 2026 - Apr 04, 2026
net-rs: add clickable tip badge popups showing node IDs
Tip count badges on the chain tree now show which nodes are on each
tip. Click a badge to see a sorted node list; click a node to select
it on the graph and open its inspector. The popup updates live as
nodes switch tips and auto-closes when the tip clears.

- Change tipCounts from Record<string, number> to Record<string, string[]>
- Render popup via portal to escape scroll container
- Position popup bottom-anchored above the badge

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: fix fork switch regression and deterministic tie-breaking
Three consensus fixes:

1. Stash fork blocks that aren't yet longer than the adopted tip instead
   of immediately switching (which caused adopted_tip to regress to a
   lower block number). Stashed blocks are replayed in order when a
   longer block on the fork triggers the actual switch.

2. Extract is_better_tip() for DRY deterministic tie-breaking (higher
   block_number wins, lower hash breaks ties). Used in chain_tree
   insert, on_tip_advanced, and on_validation_complete.

3. Stop injecting chain store rollbacks on peer ChainSync RollBackward
   messages — in a multi-peer network, one peer diverging doesn't mean
   our chain should roll back. Fork switch rollbacks are already handled
   by on_validation_complete.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: update docs for net-cluster, net-ui, and current test count
Add missing README.md files for net-node, net-cluster, and net-ui crates.
Update top-level README and CLAUDE.md with workspace structure additions
(chain_tree.rs, net-ui), correct test count (376), new dependency table
entries, and feature descriptions for cluster orchestrator and web UI.
Fix mux README to reflect PriorityWfq as the default scheduler.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: accumulate chain tree entries across polls to prevent gaps
When nodes are at different chain heights, their 10-block snapshot
windows may not overlap, causing visible breaks in the merged chain
tree visualization. Seed the merged entries map from the previous
poll's tree so blocks persist, and prune entries more than 30 blocks
behind the tip.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: make charts and chain tree collapsible blur overlays on graph
Graph now fills the full viewport. Charts, chain tree, event log,
inspector and header are all blur overlays. Charts and chain tree
have toggle buttons (^ Charts, ^ Chain) that collapse/expand them.
All panels stack correctly in every open/closed combination.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: make inspector a semi-transparent overlay on the graph
Move the inspector panel from the right sidebar to a blurred overlay
on the right 30% of the topology graph, visible only when a node or
edge is selected. Content-sized with scroll, anchored above the chain
tree overlay. Sidebar is now fully dedicated to the event log.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: add chain tree visualization to node inspector
Display the node's consensus chain tree in the inspector panel as an
SVG diagram of linked blocks. The main chain is shown in blue with the
tip in green; fork blocks appear in orange. Fork blocks share the main
lane when their column is free, and only get their own lane when there
is a collision — descendants inherit their parent's lane.

Backend: add ChainTreeEntry type and ChainTree::snapshot() which walks
backward from the adopted tip for up to 10 blocks, collecting fork
blocks within the window and extending to include fork points. The
snapshot is included in the stats POST to the cluster server and
forwarded to the UI via the stats API.

Cluster: mirror ChainTreeEntry in net-cluster types with serde(default)
for backward compatibility with older net-node binaries.

UI: new ChainTreeView SVG component with auto-scroll to latest blocks.
Integrated into InspectorPanel below the tip display. Dark-themed
scrollbars across all components via MUI CssBaseline overrides.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: fetch intermediate blocks on fork switch via range requests
Previously, when a peer announced a longer competing chain, consensus
only fetched the tip block. Intermediate blocks between the common
ancestor and the new tip were never fetched, leaving the ChainStore
incomplete and causing the chain tree display to show a truncated chain
after fork switches.

Changes:

Coordinator: forward all ChainSync headers to the application (not just
tips ahead of best), so consensus can build a complete chain tree with
intermediate block headers from competing forks.

Consensus (on_tip_advanced): use the header's own point (not the tip
point) when inserting intermediate headers during catch-up, since the
header and tip differ when a peer is ahead by multiple blocks. Issue
FetchBlockRange instead of FetchBlock, walking the chain tree backward
to find the earliest unvalidated ancestor and fetching the full range
in one request.

Consensus (on_validation_complete): handle out-of-order block arrival
from range fetches. When a validated block is an ancestor of the adopted
tip (not a fork), inject it without triggering a spurious fork switch.
After injection, check for remaining unvalidated ancestors and fetch any
gaps. Track validated blocks in a HashSet for efficient lookup.

Protocol: add FetchBlockRange { from, to } to NetworkCommand, routed by
the coordinator to the best peer via the existing BlockFetch range
protocol (PeerCommand::FetchBlocks).

Telemetry: derive tip_block_no and tip_hash from the adopted tip (same
source as chain_tree snapshot) rather than from speculative TipAdvanced
events, ensuring consistency between the stats fields and chain tree.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: fix UI memory leak from MUI Chip re-rendering
Root cause: EventLog rendered 500 MUI Chip components 4x/sec via SSE
event batches. Each Chip creates heavy DOM/style state that accumulated
faster than GC could reclaim.

Fixes:
- Replace MUI Box/Typography/Chip in event rows with plain div/span
- Move event array to mutable ring buffer outside Zustand store
- Use version counter to trigger EventLog re-renders
- Remove debug feature flags used during investigation

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: decouple TopologyNode stats from ReactFlow diffing
Move stats subscription from TopologyGraph (which rebuilds all nodes
every poll) into individual TopologyNode components via useStore.
Prevents ReactFlow from seeing data changes every second.

Also: throttle D3 force ticks to RAF, reduce SSE flush interval
50→250ms, remove smooth scroll from EventLog.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: fix ChainSync idle timeout and add deterministic tip tie-breaker
ChainSync TIMEOUT_CAN_AWAIT was 10s, causing peer disconnects when
block production gaps exceeded 10s. Changed to 3673s to match the
spec intent (server holds client until a new block arrives).

Also add deterministic tie-breaking in ChainTree: when two blocks
have the same block_number, lower hash wins. Prevents permanent
chain splits from arrival-order bias.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: add 1s validation delay and cluster block rate override
Bump default rb_body_validation_ms_constant to 1000ms so block
validation takes ~1s, creating more visible data flow in the UI.

Add rb_generation_probability to ClusterConfig so the cluster can
override the base config's Praos-standard 0.05. Sample cluster
config sets 0.2 (one block per 5s average).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: fix RTT measurement to include simulated link latency
Two issues fixed:
- KeepAlive RTT now includes the configured inbound_delay so reported
  latency reflects the simulated link delay (real localhost RTT is ~0)
- Accepted (inbound) peers skip RTT storage since they can't match a
  configured delay; the outbound side of each connection tracks RTT
- LatencyMeasured events are exempt from the delay buffer (they're
  measurements, not data)

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>