The first section of the FrogNet specification. The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY and OPTIONAL in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals.
Current implementation clauses: October 12, 2026
Network Shared RAM
An addressable shared-state surface. Participants publish their own truth and read the state they depend on. The contract does not inherently promise persistence, replication or continuity after a memory-world change.
Ribbit and semantic transport
Ribbit exposes memory operations to applications. Semantic transport reduces repeated representation below the application. Do not use UnREST as a synonym for every current protocol or infer semantic compression in the Kotlin RAW member.
Lillypad, pond and DIF
A lillypad is a local network context. A pond is a scoped membership context, corresponding to the DIF idea. A lillypad may participate in several ponds; recursive scope is the architectural model.
Implemented scope
r19-a15 includes region-driven nodes and device bridges, one forward pond and reach into other permitted ponds. Arbitrary recursive-depth qualification is not established by those tests.
The detailed clauses, rationale, source citations and author commentary below remain the mechanism reference. Where the added region or modern Ribbit contract differs, use the implementation-specific scope stated above; the local and broker paths remain separately identified.
FrogNet Specification — Draft 0.9, revision 2026-08-29. Cite a conformance claim against this revision, not against a section number alone.
1. Scope
This specification defines the FrogNet Living Network: a self-forming, self-healing mesh network that replaces the HTTP substrate with a stateful system optimised for network shared memory. It states what a conforming implementation MUST do. It does not argue for the design; the reasoning lives in the build manual, and each section names the chapter it derives from.
The specification covers five separable bodies of work, in dependency order: network formation (§4, §6), overlay and span (§5, §7), role election (§8), a stateful substrate in place of HTTP (§10, §11), and network shared memory (§9). The fifth is the purpose of the other four. An implementation MAY conform to a subset, and MUST state which sections it claims.
1a. The thesis, and what it maps onto
Stop building a distributed system out of computers. Build a computer out of a distributed system.
The conventional model is independent computers plus the machinery that makes them behave collectively: endpoints, protocols, synchronisation, retries, coordination. This specification describes the inversion — the distributed collection is the machine, and a program uses the abstractions that machine supplies rather than programming the relationships between its parts.
Read literally, that gives every component in this document a counterpart in ordinary computer architecture. The correspondence is not decoration; it is why the rest of the specification takes the shape it does.
In a machine
In a FrogNet
Specified in
Core
Node
§3
Shared memory
FrogNet Memory — one store, one serialization point
§9
Memory controller
The elected database host
§8
Interconnect
The mesh and its bearers
§5, §7
Interconnect addressing
Routing
§5
Hardware enumeration at boot
Discovery
§4
Hardware added, removed or rearranged
Merge, split, heal
§6
Which core takes which duty
Capability election
§8
Losing a core and carrying on
Re-election and re-derivation
§8, §13
Traffic the interconnect need not carry
SAME/DIFF on the wire
§11
The correspondence extends to how the machine is measured. A conventional computer is asked how fast its processor executes instructions. A FrogNet is not usefully asked that: its nodes already execute independently and concurrently, and adding one adds computation rather than adding a client. What the parts share is memory, so the machine-level question is how many shared-memory operations the machine services per second — not how fast any node runs (§14.1a).
That reframes what a large elected host is. It is not a big server the others depend on; it is a more capable memory subsystem fitted to the machine (§17.3). And it reframes the transport mechanisms: persistent sockets, SAME/DIFF, semantic compression and duplicate-work collapse are not networking optimisations bolted on, they are what keeps the memory subsystem from being the part that limits the machine.
The correspondence is a reading aid, not a conformance claim. It breaks in the places this specification names — there is no cache coherence protocol because there is nothing to make coherent (§2a), no notification when a value changes (§17.2), and the interconnect can partition, which a backplane cannot (§6). Where the analogy and a normative statement disagree, the normative statement governs.
2. Conformance
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY and OPTIONAL in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals.
These key words are normative only where they appear in capitals. Where this document describes behaviour without them, it is describing the reference implementation, not constraining a conforming one.
A claim of conformance MUST name the sections claimed and MUST be accompanied by evidence produced from the implementation's own output, not from description. §16 states the evidentiary standard: a component counts as exercised only where its registered log marker appears in the run's own log, and every oracle MUST be paired with a control that forces it to fail.
A set of nodes sharing one membership, one topology view, and one authoritative FrogNet Memory store. To a node it is not declared: it is the current set of nodes that can reach each other, recomputed whenever reality changes. A broker holds a separate administrative record under the same word — a named pond with a member limit and a group token — which answers who may join rather than who is reachable (§6.1).
The node holding the coordination plane — capability, presence, the services table. Selected deterministically as the highest node address, not elected. Distinct from the database host.
A rendezvous node carrying the inter-site data path. It holds no identity of its own and no pond secret, runs none of the semantic stack, forwards in the kernel, and is not a member of any pond. It does keep a registration row per node (§7.4).
Song of the Frogs Adaptive Communications Protocol. The media plane of the Communicator: a nine-rung ladder that trades fidelity for continuity as the link tightens. Distinct from FNWP-1 and BLDC-1, which carry the control plane beneath it.
SotF's relay: forwards one media stream and bounds the call rate to the slowest participant. Distinct from the broker, which is the WireGuard rendezvous; the two MUST NOT be conflated.
An object conforming to one interface with a small number of virtual slots, through which every exchange is processed. A handler naming a ROLE_NAME participates in election; one naming none is a content handler.
FrogNet Wire Protocol. The binary framing: length-prefixed, opcode- and sequence-tagged frames on an established socket. The wire constant is the ASCII literal FNW1; the protocol name is FNWP-1 and the two MUST NOT be confused.
Bullfrog Long Distance Communications Protocol. Semantic compression by far-end re-execution and comparison. Not a cache: it re-executes against the origin and reports identity, and never answers from a stored copy.
A no-argument verb any object in any process MAY answer to, meaning re-state what the object is into wherever the coordination plane now lives. Not confined to handlers and not a class hierarchy.
There is no client and no server. A program does not fetch a value from somewhere; it reads a value that is present, and writes values that then are. The question a distributed program normally asks — which service do I call, and what if it does not answer — is replaced by what is the current value, which has no failure mode of its own.
Programming-model note. FrogNet applications should not normally recreate client/server relationships above Memory. A producer publishes what it knows without identifying a consumer; a consumer reads the state it needs without identifying a producer. If an application is primarily constructing requests, replies, subscriptions, acknowledgements, retries, or recipient lists on top of tuples, it has recreated the programming model FrogNet Memory is intended to replace (§10.3b).
Conceptually the surface is:
/* the shape of the surface, not its signatures.
The implemented operations are put / get / get_all — see §10.3 */
memset(tuple, value) write what you know
value = memget(tuple) read what is currently true
memwatch(tuple) be told when it changes NOT A FABRIC OPERATION
The third is listed so that no reader goes looking for the call, and named that way deliberately: it is not an unfinished FrogNet operation. Observing change is application policy and does not belong in the fabric (§10.3a) — a substrate that knew which changes mattered to which program would have those programs’ semantics inside it. There is no notification when a value changes, anywhere in FrogNet (§9.4, §17.2); how a program observes change is its own choice (§10.3a). A callback on role reassignment is a different mechanism, belongs to the UnREST service definition, and does exist (§10.7). Topology change is separate and does propagate, as a notification that something changed and never as a value (§4a.5, §11.13). The implemented calls are put(), get() and get_all() (§10.3).
FrogNet Memory defines the distributed memory model; applications define behaviour. Where a value lives, how it travels, and what happens when two writers arrive at once belong to the memory model once, rather than to every application in turn. What a value means belongs to the application. That division is normative: an implementation MUST NOT require an application to supply any part of the first, and MUST NOT interpret any part of the second.
5. Document conventions
Each section names its derivation in the build manual on a cross-reference line beneath its heading. Where a normative statement rests on a value in source, that value is cited with its file. Where a section is not yet complete, an explicit PENDING SOURCE block states what is missing rather than supplying a plausible figure; an unmarked absence is a defect in this document, not a permitted implementation choice.
Two named errors recur in readings of this specification and are corrected here once. First, nothing is copied: there are no replicas, no deltas, no anti-entropy, and no merge (§2). Second, gossip carries topology, never memory: a gossip wave carries a change notification, never a value (§4).
6. References
Normative: all sections of this specification. Informative: the build manual (Magnum Croakus), Internals, UnREST by example, and the simulator. Lineage: Gelernter and Carriero, Linda tuple spaces, Yale, 1985; the three-coordinate key is FrogNet's indexing convention, not Linda's.