v1.3.3 — Logging facade + TWIN/trunk roster observability
Highlights
Logging facade
geulog:: replaces ad-hoc TRUNK_DEBUG flags and direct stderr writes. Async worker, 7 subsystems (core, client, trunk, twin, satellite, redis, mqtt), configurable via LOG= in [GLOBAL] and live-reloaded over the command PTY. Documented in docs/LOGGING.md.
Twin protocol observability (fixes #3)
Twin-connected reflectors now exchange the full connected-station roster over the [TWIN] link (reusing MsgTrunkNodeList, no new wire type).
/statusexposes a newtwinobject: connection/hello state for both directions, peer id, priorities, andtwin.nodes— the partner's roster.- MQTT publishes the twin partner's roster under
nodes/<peer_id>. - Redis
pushPeerNode/ tombstones also cover twin partners. - Cleared automatically when the twin link goes fully inactive.
/status parity for trunk peers
/status.trunks[SECTION].nodes now surfaces the per-peer roster that was already flowing to MQTT and Redis. Dashboards can attribute every node to a specific reflector from a single /status call.
Other
docs/LOGGING.mdsysop reference (linked from README).- Redis peer-node mirror + input sanitization on trunk-received strings.
- MQTT init fixed to work in satellite mode; retained per-client status blobs published.
reflector: fix clientStatus() isMember check to target nodes subtree.
Caveat (pre-existing)
In PAIRED trunk mode, both paired peers share one peerId(), so the latest roster arrival overwrites the prior one. MQTT, Redis, and /status.trunks[X].nodes all reflect this. Fixing it requires per-connection peer_id attribution and is tracked as future work.