Commit Graph
4 Commits
Author SHA1 Message Date
Edwin Knuth 7fdbd94502 docs: correct .env.example's reticulum node id derivation (RE8) (#898)
.env.example still described the #896 model: the ingestor owning an RNS
identity and deriving its !xxxxxxxx from "the transport identity already
in RETICULUM_CONFIG_DIR". #897 shipped the opposite. RE8 excludes the
transport identity from the pick, because RNS generates it as an
independent keypair that matches none of the operator's announced
destinations; the id is the discovered primary identity, the one
announcing the most destinations on the machine. README says this
correctly and .env.example contradicted it, pointing operators at the
hash rnstatus prints as "Transport Instance".

The strands-the-old-row caveat #897 added to README and CHANGELOG is
carried over too, since .env.example is where an operator is standing
when they set the variable that moves the id.

Two guards in the deployment-surface class, both negative-tested against
main, where they correctly fail.

pytest 1443 passed; black clean.
2026-08-28 22:23:27 +02:00
Edwin Knuth dc0679234f data: derive the Reticulum ingestor's own node id; scope CONNECTION out (#888) (#896)
Answers the two questions left open on #888 after #893.

INGESTOR_NODE_ID was required for PROTOCOL=reticulum because a passive
announce listener has no handshake revealing "our" node id. The premise
holds; the conclusion did not follow. The ingestor now owns an RNS
identity, generated on first run and stored 0600 as potato_mesh_identity
inside the app-owned RETICULUM_CONFIG_DIR, and derives its !xxxxxxxx
through the same identity-hash mapping applied to every peer, so its own
row is shaped like any other Reticulum row. A plain PROTOCOL=reticulum
deployment brings up the heartbeat, and so the reticulum packets/hour
scope, unaided; the variable still overrides, which also means no key is
generated for a deployment that does not need one. The identity is local
and never announced, so nothing new transmits. Persist-or-nothing is
deliberate: an unstorable identity would be regenerated per start and
each generation is a different node id, filing one orphan ingestor row
per restart, so the provider reports no id and warns instead. An existing
but unreadable key file is never overwritten. The startup warning #890
emitted for an unset INGESTOR_NODE_ID is removed.

CONNECTION and RETICULUM_CONFIG_DIR/RETICULUM_INTERFACES are disjoint
rather than in conflict: CONNECTION names one serial, TCP, or BLE
endpoint and an RNS stack has no such thing, which is why connect() has
always ignored it. What was wrong was the silence, since the image sets a
serial default for every protocol. connect() now says once at info that
the value is dropped and names the two variables that do apply. The image
default stays: removing it would change how meshtastic and meshcore
containers resolve their port, and a Reticulum follow-up is the wrong
change to carry that.

SPEC RN9/RN10, ACCEPTANCE RN-A9/RN-A10; CONTRACTS, README and
.env.example reconciled. 100% line and branch coverage on the provider;
pytest 1442 passed, rspec 1717 examples 0 failures.
2026-08-28 10:16:56 +02:00
Edwin Knuthandoregonknuths a25140ee57 Add Reticulum announce ingestor provider (#888) (#890)
Co-authored-by: oregonknuths <159513803+oregonknuths@users.noreply.github.com>
2026-08-24 21:41:16 +02:00
Edwin Knuthandoregonknuths ace03b6807 Add Reticulum protocol support to the web tier (#888) (#889)
Co-authored-by: oregonknuths <159513803+oregonknuths@users.noreply.github.com>
2026-08-24 21:34:39 +02:00