Releases: defenseunicorns/peat
Release list
v0.9.0-rc.29
Added
- mDNS-discovered peer dialing (Android) (#1007) —
the Automerge connection manager
now consumes the peat-controlled_peat._udpbrowse
(transport.peat_mdns_events()) alongside iroh'sMdnsAddressLookup,
converts each discovered peer to a dialablePeerInfo(via peat-mesh's new
From<discovery::PeerInfo>bridge, peat-mesh#268) and dials its advertised
concrete addresses withconnect_peer. Fixes the Android
"discovered-but-no-dial" gap: iroh swarm-discovery emits nothing on the
wildcard-bound interface there, so nodes advertised but never connected and
the peer count stayed at 0. Runs alongside the iroh path on desktop
(get_connectiondedup prevents a double-dial); a non-hex node_id is skipped.
(peat-protocol)
Added — peat-ffi
- Deterministic formation iroh identity for
createNode(#1006) —
a canonical
formation iroh identity is derived forcreateNode, with an explicit
node_idfor a stable endpoint identity across restarts. Emits an identity
base64 fallback log on non-Android too. bindAddressthreaded throughcreateNode(#1006) —
thecreateNodeJNI
entrypoints accept abindAddressso the iroh endpoint binds to the detected
LAN IP on Android instead of the wildcard interface.- mDNS reconnect watchdog (#1007) —
dial-side formation auth now routes through
peat-mesh'srespond_to_formation_auth, with a watchdog that re-dials peers
on mDNS reconnect. - UniFFI-exported blob-transfer surface +
blob_fetch_start(#1017, peat#1013) —
enable_blob_transfer,blob_add_peer,blob_put,blob_exists_locally,
blob_endpoint_id,blob_bound_addr(previously JNI-only) now carry
#[uniffi::export], plus newblob_add_peer_id(wraps peat-mesh's
add_peer_from_hex_id) and the async, poll-based
blob_fetch_start(hash, size, peer_id: Option<String>)->
Arc<BlobFetchHandle>.peer_id = Noneruns the mesh-syncfetch_blob
path;Some(id)runs peat-mesh's new direct-peerfetch_blob_from_peer
path — one entrypoint, both delivery modes.BlobFetchHandle::dispose()
aborts the underlying task for real mid-transfer cancellation.
enable_blob_transfer'sbind_addrparam changes from
Option<SocketAddr>toOption<String>(SocketAddrisn't
UniFFI-liftable); the JNI wrapper now passes the raw string through
instead of pre-parsing, so a malformed non-empty bind address surfaces as
an error instead of silently falling back to an ephemeral bind.
Pinned
peat-meshfloor raised to0.9.0-rc.45(peat-mesh#274 —
NetworkedIrohBlobStore::fetch_blob_from_peer, the direct-peer blob-fetch
pathblob_fetch_startconsumes). Default features unchanged
(peat-meshcontinues to build withdefault-features = false, per-crate
opt-in).
v0.9.0-rc.28
Added — peat-ffi
- Persistent peer roster (#1000) —
RosterStore(JSON on disk) tracks known
group members across restarts. Exposed via six new UniFFI surface methods:
roster_remember,roster_upsert,roster_remove,roster_get,
roster_list,roster_list_by_group. Also adds theRosterEntryUniFFI
Record. Stored as plain JSON (non-secret reachability hints only; no FIPS
concern). - Per-peer reconnect supervisor (#1000) — dial state machine
(Idle → Connecting → Connected → Backoff) with exponential backoff (2 s
base, 5 min cap) plus deterministic per-peer jitter to de-correlate
thundering-herd re-dials. Three new UniFFI surface methods:
reconnect_known_peers(gentle, honours backoff),wake_reconnect(clears
backoffs — call on foreground / network-up events),on_peer_observed(hint
that a specific roster member is reachable now). Concurrent in-flight dials
are bounded atMAX_CONCURRENT_RECONNECT_DIALS = 8. - Cross-transport reconnect dedup (#1000) — the supervisor's connected set
is the union of iroh peers and any roster member with a live link on any
transport (BLE, etc.), so a peer already reachable over BLE is not also dialed
over iroh/relay. - Origin-tagged
DocumentChange(#1000) — new required field
origin: ChangeOriginon the UniFFIDocumentChangeRecord.ChangeOrigin
is a new UniFFI enum with variantsLocal(own publish) and
Remote { peer_id }(sync from a peer). Enables consumers to notify only on
remote changes. Coordinated binding regen required — paired with
peat-flutter#13. - Four Dart C-ABI shims (#1000) — hand-rolled
#[no_mangle] extern "C"
functions reformatting flatFFIBufferarrays forroster_remember,
reconnect_known_peers,wake_reconnect, andon_peer_observed. Sit
alongside the existing shims indart_ffi.rs. - Contributor workflow guardrails (#1000) —
CLAUDE.mdandSKILL.mdnow
require fork contributors to sync to upstreammainbefore opening a PR, run
the verification checklist, and pass the consumer-reference grep gate.
Pinned
peat-mesh>=0.9.0-rc.43, <0.9.1(unchanged from rc.27).
peat-ffi 0.1.4 (Maven AAR)
Published com.defenseunicorns:peat-ffi:0.1.4 to Maven Central.
Maintainer: edit this release to add changelog entries, breaking-change notes, and consumer migration guidance.
v0.9.0-rc.27
Fixed — peat-protocol
relay-n0-hostedfeature now forwards topeat-mesh(#995). After the
ADR-062 relocation movedIrohTransportendpoint construction (presets::Empty
vspresets::N0) into peat-mesh,peat-protocol'srelay-n0-hostedfeature
was left an orphaned no-op (= []) — enabling it had no effect on the relay
posture. It now forwards topeat-mesh/relay-n0-hosted, so the documented
"flips everyIrohTransportconstructor to the n0-hosted preset" behavior
takes effect again. Still OFF by default (tactical/edge builds must not phone
home through n0 infrastructure).
Added — peat-ffi
- Non-blocking
PeatNode::connect_peer_nowait(#995) — a fire-and-forget
variant ofconnect_peerthat spawns the dial + formation handshake + sync
trigger on the runtime and returns immediately, so UI consumers don't freeze
on the synchronous FFI call for the full dial duration. Background failures
are surfaced viatracingon every platform. Ships in the Maven AAR 0.1.3 cut. relay-n0-hostedfeature passthrough (#995) — forwards to the
peat-mesh/peat-protocolfeature of the same name. OFF by default.
Pinned
peat-mesh>=0.9.0-rc.43, <0.9.1(unchanged from rc.26).
peat-ffi 0.1.3 (Maven AAR)
Published com.defenseunicorns:peat-ffi:0.1.3 to Maven Central.
Added
PeatNode.connectPeerNowait(...)— a non-blocking, fire-and-forget variant ofconnectPeer. It spawns the connect + formation handshake + sync trigger on the runtime and returns immediately, so UI callers don't freeze on the synchronous FFI call for the full dial duration (~seconds for an unreachable peer). On success the peer appears inconnectedPeers/ a Connected event fires; background failures are surfaced viatracingon every platform and otherwise dropped (there's no synchronous caller to return them to). (peat#995)relay-n0-hostedfeature passthrough — opt-in build feature forwarding to thepeat-mesh/peat-protocolfeature of the same name (n0-hosted relay pool + pkarr DNS discovery). OFF by default; enabling it routes peer traffic through n0's public CDN. (peat#995)
Compatibility
Additive only — no JNI ABI break. Existing consumers link against the 0.1.2 surface unchanged. Pairs with workspace crates.io release 0.9.0-rc.27 (peat-protocol/peat-schema), which carries the matching peat-protocol relay-n0-hosted forwarding fix.
Consumer migration
No migration required. To adopt the non-blocking connect, switch UI-thread connectPeer calls to connectPeerNowait and observe results via connectedPeers / the Connected event rather than the (now-immediate) return value.
v0.9.0-rc.26
Changed — peat-protocol
- Distribution / file-transfer implementation relocated to peat-mesh
(#993, peat#992).peat-protocol::storage::{file_distribution, model_distribution}now re-export frompeat_mesh::storage::…— peat-mesh is
the canonical iroh consumer (ADR-060 §5), so the transport-specific impl no
longer lives in the protocol layer. Public surface unchanged. Requires
peat-mesh rc.43. (peat-protocol's directirohdep is not yet dropped —
network/transport/mesh_sync_transportstill use it.)
Added — peat-protocol
- ADR-071: subscription-based convergence seam (#991). Receiver-evaluated,
sender-ignorant "need" (theNeedEvaluatorabstraction,collectionon the
distribution document, theshould_deliver/can_skip_permanentlygate),
opt-in viaIrohFileDistribution::with_need_evaluator(default preserves
directedtarget_nodesdelivery).
Added — peat-ffi
v0.9.0-rc.25
What's Changed
- chore: remove LightFish and DiSCO consumer references by @kitplummer in #976
- chore: replace sapient plan with redirect stub by @kitplummer in #977
- fix(sync): converge BLE-bridged docs + carry app collections over lite-bridge by @kitplummer in #978
- docs(adr-070): correct coordinate system handling; remove MGRS anticipation by @kitplummer in #979
- perf(protocol): skip Automerge decode for already-handled inbox distributions (peat#980) by @kitplummer in #981
- chore: bump workspace version to 0.9.0-rc.25 by @kitplummer in #982
Full Changelog: v0.9.0-rc.24...v0.9.0-rc.25
v0.9.0-rc.24
Proto package namespace cap.* → peat.* (ADR-069, peat#972). All 20 schema protos move from package cap.<domain>.v1; (a fossil of the project's original academic name, Capability Aggregation Protocol) to package peat.<domain>.v1;, matching the project name and the existing peat.sidecar.v1 service namespace. The peat-schema Rust module tree is flattened, so the canonical path is peat_schema::<domain>::v1::<Type> (the pre-existing flat re-export means consumer imports are unchanged). Breaking only at the descriptor / reflection / fully-qualified-name layer (cap.node.v1.Node → peat.node.v1.Node) — affects buf, grpcurl reflection, and any FQN-keyed registry. Not breaking: proto3 binary wire, persisted Automerge/postcard documents (the package is not encoded in messages), gRPC method paths (these protos define messages only), or proto3 JSON keys. Pre-1.0 clean break, consistent with the ADR-066/068 precedent. The spec/proto/ reference tree + draft-peat-protocol-*.md update is a deferred spec-doc follow-up.
v0.9.0-rc.23
ADR-068 Node base-unit vocabulary, Phase 1 (peat#969, epic peat#968). The schema and protocol converge on Node as the single name for the base mesh participant, eliminating the overloaded "Platform" (ADR-068, which amends ADR-066's Platform row). Renames across the wire surface: platform_id(s) → node_id(s), platform_type → node_type, target_platform(s) → target_node(s), source_platform(s) → source_node(s), DEVICE_TYPE_SENSOR_PLATFORM → DEVICE_TYPE_SENSOR_NODE, and the FFI/storage surface (PlatformInfo/PlatformStatus → NodeInfo/NodeStatus, collection "platforms" → "nodes"). Wire-breaking (proto field numbers are preserved, so the binary format stays tag-compatible; field names, JSON keys, and the collection name break) — a pre-1.0 clean break consistent with the ADR-066 precedent in rc.22. The role-label prose "Strike/Support platform" and OS/hardware "platform" contexts are intentionally preserved as a class-of-vehicle / computing-platform carve-out. peat-mesh adopted the matching internal HierarchyLevel::Platform → Node rename in 0.9.0-rc.35 (Phase 3). Downstream lockstep: peat-node Phase 4 renames its sidecar Platform/PutPlatform/GetPlatforms surface and the "platforms" collection to match; peat-atak-plugin (Phase 5) must regenerate its FFI bindings.
v0.9.0-rc.22
ADR-066 hierarchy vocabulary rename (peat#957, peat#904 Phases 1+2). The schema and protocol adopt the abstract, non-military hierarchy vocabulary defined in ADR-066: the four aggregation tiers are now Cell → Cohort → Federation → Coalition (replacing Squad/Platoon/Company and adding a fourth top tier). This is a wire-breaking change to the renamed proto fields, messages, and enum values — peers and persisted documents produced before rc.22 are not compatible across the rename. peat-mesh adopted the matching internal HierarchyLevel rename + Coalition tier in 0.9.0-rc.31 (Phase 3).
Changed — peat-schema (wire format)
cell.proto:Cell.platoon_id(field 5) renamed toCell.cohort_id. Same field number, sameoptional stringtype and LWW-Register semantics — only the name changed.- Hierarchy summary messages renamed:
SquadSummary→CellSummary,PlatoonSummary→CohortSummary,CompanySummary→FederationSummary, plus a newCoalitionSummaryfor the fourth tier. Their leaf identifier fields rename accordingly (squad_id→cell_id,platoon_id→cohort_id). command.protoCommandScopeenum:SQUAD = 2→CELL = 2,PLATOON = 3→COHORT = 3, addedFEDERATION = 5andCOALITION = 6.target_idsnow carries node/cell/cohort/federation/coalition ids.- Type registry / ontology:
TypeDescriptorfield metadata and the ontology concepts updated (platoon/company→cohort/federation/coalition); type IDs (peat.cell.v1.*,peat.node.v1.*) and hyphenated collection names are unchanged.
Changed — peat-protocol
- Internal coordinator, leader-election, routing, discovery, hierarchy-aggregation, and command types renamed
squad_id→cell_idand the analogous tier fields throughout, tracking the schema rename. No new public capability beyond the rename. automergedependency bumped0.7.1→0.9.0to stay ABI-compatible with peat-mesh0.9.0-rc.31(which moved to automerge 0.9). Required becausepeat-protocol'sautomerge-backendfeature shares theAutomergetype with peat-mesh's storage layer across the re-export boundary; a version split producesmismatched typesagainst everyAutomerge-typed call site. Nopeat-protocolsource changes were needed beyond the bump — the 0.9 read/write API surface peat-protocol uses (ReadDoc/Transactableget/put/put_object) is source-compatible.
Migration
Consumers that round-trip the renamed fields must update to the new names (e.g. platoon_id → cohort_id on CellState). Because field numbers are preserved, Protobuf binary payloads decode unchanged; JSON/named-field access and any hardcoded CommandScope enum names must be updated.