Skip to content

deps(ios): bump RNS pin to 1.5.2 + surface operator LXMF contact - #197

Open
torlando-tech wants to merge 2 commits into
mainfrom
deps/ios-rns-1.5.2
Open

deps(ios): bump RNS pin to 1.5.2 + surface operator LXMF contact#197
torlando-tech wants to merge 2 commits into
mainfrom
deps/ios-rns-1.5.2

Conversation

@torlando-tech

Copy link
Copy Markdown
Owner

Bumps the RNS wheel pin to the 1.5.2-based fork branch and surfaces the new
operator LXMF contact field in interface discovery.

What changed

  • support/fetch-wheels.sh: RETICULUM_REF754654fe… (branch
    patches/columba-ios-1.5.2 = upstream 1.5.2 tag + the six embedded-runtime
    hardening patches rebased cleanly on top).
  • PythonRNSBackend.swift: advertised RNS version label 1.3.11.5.2
    (cosmetic, no in-app reader).
  • Tests/static/test_ios_stamp_runtime_hardening.py: SHA pin updated to the
    new head.
  • LXMf contact (RNS 1.5.0+): DiscoveredInterface.operatorLxmfAddress
    (lenient decode; absent/empty → nil), a compact-card "Contact:" row and a
    detail "Contact" field row in DiscoveredInterfacesScreen, Localizable
    entries, and a decode regression in RNSAPITests/DiscoveredInterfaceTests.
    This is display-only — the app emits no discoverable interface, so it only
    shows contacts other operators announce.

The bridge discovery_json() already passes announce info keys through, so no
rns_bridge.py change is needed for the contact field.

Verification (real execution)

  • Mac worktree fetch-wheels.sh: produced rns-1.5.2@754654fe,
    lxmf-1.1.0@8912186e, ble_reticulum-0.2.2@07d94130; provenance validator
    passed; 0 symlinks.
  • Built bundle ships rns-1.5.2.dist-info, __version__ = "1.5.2", deployed
    Discovery.py has the operator_lxmf_address field.
  • ColumbaAppTests on iPhone 17 sim: 512/512, 0 failures (was 511 before
    the LXMf decode test).
  • RNSAPITests.DiscoveredInterfaceTests via swift test: 23/23 (incl. new
    LXMf present/absent/empty decode).
  • Sim in-process restart smoke on 1.5.2: toggle discovery → Apply & Restart →
    config written → in-process restart complete, stack back up
    (interfaces=rnsd-interop-intero:1, Delivery/Telephony announces),
    discover_interfaces = yes took effect, no errors/Traceback. This exercises
    the 1.5.2 singleton stop→start cycle — the main regression risk of the bump.
  • AutoInterface guard path is unit-covered (RuntimeFlavorTests 398–402) and
    short-circuits before RNS teardown, so it adds no RNS-bump coverage.
  • Device build + install + restart smoke running (see post-PR update).

Notes

  • The .requiresRelaunch guard (added in feat(ios): interface discovery + Network Status discovery UX (issue #193) #196 / 8085fca9) still refuses
    in-process restart when an AutoInterface is configured. Its premise —
    "AutoInterface.detach() doesn't release multicast sockets" — no longer holds
    on this 1.5.2 wheel (detach() now closes sockets and joins threads). Removing
    that guard is a separate behavior change and is deliberately out of scope
    here (kept to the minimum bump). Tracked as follow-up.

…4654fe)

Rebased the six embedded-runtime hardening patches onto upstream 1.5.2
(AutoInterface.py is byte-identical between 1.4.2 and 1.5.2, so the
hardening stack applies unchanged; only tests/all.py needed a union
merge of import blocks). The 1.5.2 base adds the optional LXMf operator
contact field in interface discovery announces (discovery_lxmf_address),
discovery announce caching/validation, and dataplane ingress/egress
control.

Also corrects the stale PythonRNSBackend capabilities version label
(reticulum 1.3.1 -> 1.5.2, lxmf 0.9.9 -> 1.1.0) to match what the pinned
wheels actually ship, and updates the static dependency contract test
pin.
…1.5.0+)

RNS 1.5.0 adds an optional operator contact field to on-network interface
announces (discovery_lxmf_address -> operator_lxmf_address, 32-hex). The
bridge discovery_json() already passes announce info keys through, so the
iOS side only needs the model field plus a UI row:

- DiscoveredInterface: operatorLxmfAddress (lenient decode; absent/empty ->
  nil, mirroring the other optional string fields — pre-1.5.0 announces
  lack the key entirely and must still decode)
- DiscoveredInterfacesScreen: compact card 'Contact:' row (envelope icon,
  monospaced, accent) shown only when present + detail 'Contact' field row
- Localizable: 'Contact' / 'Contact:' (en)
- RNSAPITests: decode regression (present/absent/empty)

Part of the RNS 1.5.2 bump; publishes nothing — we emit no discoverable
interface, this only DISPLAYS contacts other operators announce.
@torlando-tech

Copy link
Copy Markdown
Owner Author

@greptile review

@greptile-apps

greptile-apps Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

The PR appears safe to merge, with a non-blocking compact-card layout issue for long operator contact values.

Fix All in Claude CodeFindings

  1. P2 Contact Wraps in Compact Cards

Summary

  • Pins Reticulum to the 1.5.2-based fork commit and synchronizes advertised runtime versions and hardening tests.
  • Decodes the optional operator_lxmf_address discovery field, treating absent and empty values as nil.
  • Displays operator contact information in compact and detailed interface views.
  • Adds localization resources and decoding regression coverage.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    A[RNS 1.5.2 discovery announce] --> B[discovery_json key passthrough]
    B --> C[DiscoveredInterface decoding]
    C --> D{Contact present and non-empty?}
    D -->|Yes| E[Compact contact row]
    D -->|Yes| F[Detailed Contact field]
    D -->|No| G[Contact omitted]
Loading

Comment on lines +702 to +704
Text(verbatim: contact)
.font(.caption.monospaced())
.foregroundStyle(Theme.accentColor)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Contact Wraps in Compact Cards

The compact card renders the full 64-character operator contact without a line limit or truncation. On narrow screens, this wraps across several lines and makes each card significantly taller. The nearby transport ID is already shortened for the same layout; shorten this value here while keeping the full address in the detail section.

Suggested change
Text(verbatim: contact)
.font(.caption.monospaced())
.foregroundStyle(Theme.accentColor)
Text(verbatim: String(contact.prefix(12)) + "")
.font(.caption.monospaced())
.foregroundStyle(Theme.accentColor)
Prompt To Fix With AI
This is a comment left during a code review.
Path: Sources/ColumbaApp/Views/Settings/DiscoveredInterfacesScreen.swift
Line: 702-704

Comment:
**Contact Wraps in Compact Cards**

The compact card renders the full 64-character operator contact without a line limit or truncation. On narrow screens, this wraps across several lines and makes each card significantly taller. The nearby transport ID is already shortened for the same layout; shorten this value here while keeping the full address in the detail section.

```suggestion
                    Text(verbatim: String(contact.prefix(12)) + "…")
                        .font(.caption.monospaced())
                        .foregroundStyle(Theme.accentColor)
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant