Evidence ledger

What has been qualified, what has been measured, what is still in progress, and what remains designed.

Qualification and characterization are separate. So are an unknown problem, a known root cause, a designed correction, deliberately deferred implementation and demonstrated running code. Measurements belong to the machine, path, workload and checkpoint that produced them. A documented bug is not silently promoted into an architectural failure, and a designed fix is not silently promoted into running code.

Current implementation: the shared-RAM contract and engineering record

FD&F acceptance record.

Suite / checkpointRecorded resultCoverage
r19-a14 fdf-tun20/20Three scopes with the same served prefix and assigned leaf address; bidirectional aliases, concurrent traffic, atomic configuration refusal, fd/protect path and teardown.
r19-a14 reach68/68Reach rules, identity-only resolution, ambiguity refusal, aliases, session loss and the Kotlin bridge stage.
r19-a14 region-loop20/20Real daemon and region/hub in namespaces, including Communicator endpoint resolution.
r19-a14 graph / hub17/17 · 25/25Graph and hub behavior in their individual suites.
r19-a14 placement / leaf-tunnel18/18 · 10/10On-mesh placement and routed leaf behavior.
r19-a14 member selftest24/24Planner, keys, ledger, quarantine, concurrency and bridge loss.
r19-a15 regressionRegion-loop PASSA runMerge preserves leaf names; failed against r19-a14.

Counts are reproduced from the checkpoint records. They have not been rerun as network tests while editing this website, and they must not be summed into a fictitious single suite.

Recorded hardware demonstration, October 12.

The Windows machine begins on its ordinary Internet connection and cannot reach the private FrogNet address. Starting the bridge produces a forward-via-hub path. Ping and SSH work; the PC appears in the node’s hosts file and monitor. The monitor and live topology map are accessible.

An Android client joins and participates in a live Communicator call with Windows. The displayed statistics report 1280×720 at 20 frames per second. Stopping the bridge removes the Windows machine’s private-network access.

This is a recorded operational demonstration, not a bandwidth benchmark. The latest take reports roughly 1.2–1.5 Mb/s at the receive-side stats. The Android device’s presence in /etc/hosts is recorded; an earlier take explicitly notes that its monitor row was not yet visible. Read the demonstration sequence.

On-camera observationResultContext
runMerge rebuilding the network view4.9 s, then 0.79 sTimed command after removing the hosts file; the second invocation is a repeat run, not a separate failover measurement.
Windows–Android call1280×720 · 20 fps · roughly 1.2–1.5 Mb/sDisplayed receive-side statistics in this demonstration, not a bidirectional total or a portable bandwidth requirement.
System code sizeUnder 35,000 linesReported in the demonstration for the system’s action code.
Android application code sizeUnder 6,000 linesReported in the demonstration for the Android app.

The line counts are reported in the October 12 demonstration, not a fresh source audit. A reproducible LOC comparison requires the checkout, counting tool and exclusions for tests, third-party/vendor code, generated files and build output.

Discovery and liveness measurements.

ExperimentRecorded observationsConditions
r15 address-change pipeline66 ms facts + 7 ms announce + about 5 ms local apply; about 80 ms end to endLAN namespace experiment; WAN adds region RTT for publication and world read.
r17→r19 per-event processingr17: 22–29 ms; r18: 16/18 ms; r19: 33–45 msNamespace runs, median event totals. r19’s steady path is unchanged from r18; the record identifies environment variance.
Five-second liveness configurationSilent member loss about 3.9 s; silent region loss about 4.0 sC++ and Kotlin compared on the same namespace setup.
Loss tradeoffMore false deaths at 10–20% random packet lossOne 15-member-minute comparison per condition; not a production reliability guarantee.
r16 databasehost switchover simulationUnanimous re-selection; about 19 ms for five simulated nodes after known deathThe store is not queried. Actual detection time precedes this local selection.

FrogTorch and Redis measurements remain independent.

Psychedelic FrogTorch’s four DDP campaign ratios are 1.95×, 1.64×, 1.03× and 1.75× Gloo elapsed time divided by FrogNet elapsed time. The compared semantics and correctness evidence belong with each campaign. A separate loopback result was unfavorable to the Python backend. Read the complete compute record.

The recorded Redis behavioral checkpoint has 1,502 OK / 207 N/A over 29 files on one core. The ARM64 parallel checkpoint reports 1,177 OK / 94 errors over eight files. Those errors remain errors. The original evidence also records a small-cache i7 control slower than stock Redis on several operations.

Redis scaling and topology-change tests ask another question. RT7 recorded stock moving 24,936 keys in 23.3 s while the Ribbit front moved none and served in 0.067 s. These timings do not mean every Redis command runs hundreds of times faster. Read the conversion record.

Earlier transport and call experiments.

The earlier Communicator operating point is bidirectional 160×120 video at 24 fps with uninterrupted prioritized audio at about 121 Kbps. Its route included the earlier broker and a 900 MHz segment. It is not HD video at 121 Kbps, and it is not a measurement of the new October 12 call.

Published semantic workload ratios range from 2.3× through 8,741× for different payload shapes; the large result involves mostly static megabyte structure with six changing fields. A 21-byte SAME frame is a protocol-level figure, not the complete IP/TCP transaction cost. The earlier echo comparison averaged 201 ms direct Apache and 118 ms hot SAME/DIFF on that recorded setup.

Boundaries that remain.

No general promise of a globally coherent heap, arbitrary cross-region transactions, automatic history reconciliation or application continuity across re-homing is established. Region permissions and recovery policy belong to the operator or vendor.

The old roughly 56-node tunnel allocator limit belongs to the broker-era implementation. Region routing uses a different hub/mapping path. The October 11 records do not characterize a maximum region size, so neither that old limit nor a designed 59,500-address replacement is a current region capacity result.

The source and records are author-produced. External reproduction is not established here. The Windows and Android operational demonstration adds hardware evidence; it does not replace the individual failure and scaling gates.

Root cause known

The failure mechanism has been inspected and understood. That does not by itself mean the correction is implemented.

Solution designed / deferred

A concrete correction exists, but current requirements do not justify interrupting higher-value work to implement it yet.

Implemented / qualified

The mechanism exists in running code; qualification then establishes what contract and conditions have actually been demonstrated.

Qualified

Living Network

Qualified

Multi-city network; split/heal machinery; 900 MHz mobile segment; remote physical actuation.

Specification: §4 Discovery and membership · §6 Pond formation, split and heal

Communicator

Characterized

Bidirectional 160×120 video at 24 fps with uninterrupted prioritized audio at an observed ~121 Kbps point, over TCP. The Communicator path ran Seattle → WireGuard → broker → WireGuard → New York → 900 MHz. Watch the recorded operating points.

Specification: §15 Reference applications · §14 Performance and adaptation

Python ↔ C++

Qualified

Memory and Plane interoperability exercised in both directions against the same framing and semantics.

big5 Internet RAM

Qualified

Five machines in two cities mounted one Region served from a third with the same program and no placement logic.

Redis oracle

Qualified

Redis 7.2.11 used as an external behavioral oracle. Recorded checkpoint: 1,502 OK / 207 N/A over 29 files on one core; ARM64 parallel checkpoint: 1,177 OK / 94 errors over eight files; no timeout, exception or weak-memory ordering hole was observed at that checkpoint.

Characterized

FrogTorch campaigns

Characterized

Four same-campaign comparisons: 1.95×, 1.64×, 1.03× and 1.75× versus Gloo in the recorded campaigns.

C++ Memory

Characterized

Recorded flat acknowledged run: 21,037 writes/s with zero skipped. Distinct-cell contention acknowledged: 13,974 writes/s, zero dropped of 56,052, median delivery ~1.0 ms.

Operating envelope

Characterized

One-core sandbox produced separate recommendations for distinct state, every-generation observation and latest-value freshness. These are host/policy measurements, not FrogNet limits.

Redis machine sensitivity

Characterized

On the small-cache i7-5557U MacBook, one-core Ribbit measured 0.60× / 0.66× / 0.66× / 0.41× stock Redis for SET / GET / LPUSH / SADD. With two cores it reached 1.07× / 1.18× / 1.19× / 0.72×. The unfavorable result stays beside the Pi 5 results because the representation and cache cost are part of the evidence.

In progress

Failure qualification

In progress

Listener kill, packet loss and server restart/recovery remained explicit qualification items in the recorded Network Shared RAM checkpoint.

Specification: §13 Failure and recovery

SuperTuxKart

In progress

The object model and validator exist. Completed physical-machine integration is not claimed here.

Deliberately not implemented

This is the register. A declined behavior is not hidden as a failed implementation.

Redis stale-expiry bookkeeping

Deliberate semantic difference

Redis can retain stale expiry bookkeeping until a key is touched. Ribbit does not need to reproduce that internal artifact to preserve the useful external state model.

Writer-side synchronous handoff

Deliberate semantic difference

Redis may serve a blocked client inside the writer's call. Ribbit treats publication as synchronization: publication makes the waiter runnable; the writer does not wait for the reader to consume.

Global guarantees

Non-claim

No global coherent heap, global transactions, automatic cross-Region reconciliation or automatic continuity across re-homing.

Specification: §2 Architectural invariants · §17 Known limits

Current pond-size implementation limit

Root cause known · replacement designed · implementation deferred

The broker-path implementation spends a scarce carrier resource per tunnel. In a full mesh, tunnel count therefore grows quadratically and reaches the present roughly 56-node pond limit. The failure mechanism has been traced to that allocator; it is not a limit of FrogNet discovery or the addressing model. The replacement design allocates the resource per node instead of per tunnel, changing the relevant growth from quadratic to linear and providing about 59,500 addresses under the current plan. It has not been implemented because the physical development network has only a handful of machines and the existing limit is not constraining current experiments. Code velocity was deliberately spent on work that is.

Specification: §17 Known limits

Measured comparisons

Measured comparisons

FrogTorch: same-campaign rate vs Gloo

Campaign 1
1.95×
Campaign 2
1.64×
Campaign 3
1.03×
Campaign 4
1.75×
Four same-campaign comparisons preserving ordinary DDP semantics in the compared arm. The bars are normalized to a 2.0× display ceiling.

Redis-on-Ribbit: Pi 5 throughput

SET, 1 core
268k
SET, 3 cores
704k
GET, 1 core
399k
GET, 3 cores
858k
LPUSH, 1 core
424k
LPUSH, 3 cores
1.03M
Raspberry Pi 5, million-key workload. This graph shows Ribbit's measured one-core and three-core rates; it is not a universal scaling claim.