Skip to content

fix(reticulum): multi-PN DM cascade and proxy rate-limit hardening (#817) - #818

Merged
rinchen merged 6 commits into
mainfrom
pn
Aug 7, 2026
Merged

fix(reticulum): multi-PN DM cascade and proxy rate-limit hardening (#817)#818
rinchen merged 6 commits into
mainfrom
pn

Conversation

@rinchen

@rinchen rinchen commented Aug 7, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace one-shot Direct→preferred-PN fallback with a multi-PN cascade (preferred remote → other enabled remotes → local-prop last), with stored_locally UI (PN 🏠) when the message lands only in the local inbox (#817).
  • Harden cascade concurrency and failure paths: per-message PN targets, advance on pack/max-attempt failure, safer link-timeout bridge hydration, catch-up single-flight, and per-bucket proxy rate-limit backoff (shared 900/min + dedicated LXMF recent 120/min).
  • Update docs/AGENTS/troubleshooting for the cascade model; improve locale wording for local-prop / sync-busy strings; include a redacted LXMF outbound slice in developer support bundles.

Test plan

  • Send Reticulum DMs to a peer that fails Direct (e.g. Columba/Retichat) with preferred remote PN set — confirm cascade advances and Completes as propagated when a remote PN accepts
  • With remotes unavailable but local-prop enabled — confirm Completes as stored_locally (house icon / amber PN badge), not a green delivered check
  • Concurrent outbound DMs during cascade — confirm messages do not retarget each other’s PN
  • Link-timeout while cascade eligible — UI should not prematurely mark Failed before sidecar WS outcome
  • Force heavy peer polling + inbound catch-up — LXMF recent catch-up should not starve (dedicated bucket + backoff)
  • Export for Developer support bundle — reticulum/lxmf-outbound.log present with truncated hex ids
  • pnpm run check:pr / CI green

Summary by CodeRabbit

  • New Features

    • LXMF delivery now cascades through the preferred propagation node, other enabled remote nodes, and local storage.
    • Delivery statuses distinguish remote delivery (delivered) from local storage (stored_locally), with attempt counts shown and persisted.
    • Added clearer local-storage indicators and accessibility labels in message status badges.
    • Added rate-limit backoff and request coalescing for recent LXMF and peer refreshes.
    • Support bundles now include filtered LXMF outbound diagnostics.
  • Bug Fixes

    • Improved timeout and failure handling to preserve available delivery attempts.
    • Added clearer synchronization diagnostics for busy outbound propagation links.

rinchen added 5 commits August 7, 2026 09:07
Prefer bulk getWaitingMessages for silent event-131 drains (BLE/serial/TCP)
with header X/Y progress, falling back to syncNextMessage on timeout without
disconnecting. Erase incorrect SoftAP jargon in favor of OpenHop naming.
Align telemetry skip wording, use silent-timeout constants in tests,
drop contradictory catch-no-log-ok, cover stale bulk-attempt abandon,
and remove redundant OpenHop dead-bridge check in stats fetch.
)

Direct LXMF timeouts to third-party clients often failed without propagation fallback, and inbound catch-up was starved by the shared 300/min proxy ceiling. Cascade preferred → other remotes → local-prop (PN 🏠 badge), raise/split proxy budgets with backoff, and improve outbound logging in developer bundles.
Address review findings: per-message cascade PN targets, advance on pack/max-attempt failure, safer link-timeout bridge hydration, catch-up single-flight, per-bucket rate-limit backoff, locale/doc accuracy for multi-PN + stored_locally.
Bring in #816 waiting-message drain / OpenHop improvements; keep #817 PN cascade and locale keys.
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@rinchen, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 46 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: QUIET

Plan: Pro Plus

Run ID: e41226f0-2dcb-462e-a01e-4bf982f532a7

📥 Commits

Reviewing files that changed from the base of the PR and between 8a16aa6 and 64a2e8b.

📒 Files selected for processing (14)
  • reticulum-sidecar/src/stack/live.rs
  • reticulum-sidecar/src/stack/lxmf_outbound.rs
  • reticulum-sidecar/src/stack/pn_cascade.rs
  • src/main/support-bundle.test.ts
  • src/main/support-bundle.ts
  • src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.test.ts
  • src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.ts
  • src/renderer/lib/reticulum/catchUpRecentInboundLxmf.test.ts
  • src/renderer/lib/reticulum/catchUpRecentInboundLxmf.ts
  • src/renderer/lib/reticulum/reticulumPropagationEffective.test.ts
  • src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.test.ts
  • src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.ts
  • src/renderer/runtime/useReticulumRuntime.reconnect-hardening.test.ts
  • src/renderer/runtime/useReticulumRuntime.ts
📝 Walkthrough

Walkthrough

Reticulum LXMF delivery now uses a multi-node propagation cascade with local storage fallback. The change adds distinct delivery statuses, attempt tracking, guarded timeout handling, proxy rate-limit backoff, catch-up coalescing, diagnostics, and updated documentation.

Changes

LXMF propagation cascade

Layer / File(s) Summary
PN cascade execution
reticulum-sidecar/src/stack/pn_cascade.rs, reticulum-sidecar/src/stack/lxmf_outbound.rs
Direct delivery advances through ordered remote propagation nodes and local propagation. Failures, rejected deliveries, packing failures, and repeated deferrals advance the cascade.
Cascade wiring and delivery status
reticulum-sidecar/src/stack/live.rs, reticulum-sidecar/src/stack/mod.rs, src/shared/reticulumDeliveryMethod.ts, src/renderer/...
Propagation changes refresh cascade candidates. stored_locally and delivery_attempts flow through persistence, status handling, and message badges.
Propagation-aware timeout handling
src/renderer/lib/reticulum/reticulumOutboundFailureBridge.ts, src/renderer/runtime/useReticulumRuntime.ts
Timeout handling verifies refreshed propagation state and identity before failing eligible destinations. PN cascade messages remain excluded while capacity exists.
Proxy limits and LXMF catch-up
src/main/ipc/..., src/renderer/lib/reticulum/..., src/renderer/stores/reticulumPeerStore.ts
The shared proxy limit is 900 per minute. LXMF recent requests use a 120-per-minute bucket with independent backoff. Concurrent catch-up calls coalesce into an initial request and trailing rerun.
Diagnostics and documentation
src/main/support-bundle.ts, docs/..., README.md, AGENTS.md
Support bundles include filtered LXMF cascade logs. Reticulum delivery, troubleshooting, IPC, and project documentation describe cascade behavior and status semantics.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 57.84% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the PR's main changes: multi-PN direct-message cascading and proxy rate-limit hardening.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch pn

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (3)
src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.ts-72-74 (1)

72-74: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clamp the final jittered delay to the configured range.

Line 73 applies jitter after base is capped. A low jitter value produces 4,500 ms on the first hit. A high jitter value produces 66,000 ms at the capped tier. This violates the stated 5,000–60,000 ms backoff range. Clamp the jittered value and add lower- and upper-bound tests.

Proposed fix
-  const delay = applyJitter(base);
+  const delay = Math.min(MAX_BACKOFF_MS, Math.max(DEFAULT_BACKOFF_MS, applyJitter(base)));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.ts` around lines 72
- 74, Update the backoff calculation around applyJitter so the final jittered
delay is clamped between DEFAULT_BACKOFF_MS and MAX_BACKOFF_MS before assigning
state.backoffUntilMs. Add tests covering jitter below the minimum and above the
maximum, while preserving the existing exponential backoff behavior.
src/main/support-bundle.ts-188-195 (1)

188-195: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Include propagation-retrieve diagnostics.

The diagnostics contract in docs/reticulum.md Line [275] names both propagation-deposit and propagation-retrieve targets. This filter keeps only propagation-deposit. Retrieval and catch-up failures will be absent from reticulum/lxmf-outbound.log. Add the missing pattern and a behavioral assertion in src/main/support-bundle.test.ts.

Proposed fix
 const patterns = [
   /lxmf-outbound/i,
   /propagation-deposit/i,
+  /propagation-retrieve/i,
   /LXMF advancing PN cascade/i,
+        'info target=propagation-retrieve PN retrieve',
...
+    expect(slice).toContain('propagation-retrieve');

As per path instructions, support bundles may include only filtered, redacted, truncated LXMF/PN cascade logs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/main/support-bundle.ts` around lines 188 - 195, Update the diagnostics
filter pattern list in the support-bundle construction flow to include
case-insensitive matching for propagation-retrieve alongside
propagation-deposit, and add a behavioral assertion in the support-bundle tests
confirming retrieval diagnostics are retained. Preserve the existing filtering,
redaction, and truncation behavior for LXMF and PN cascade logs.

Source: Path instructions

src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.ts-161-162 (1)

161-162: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Preserve deliveryAttempts on every status path.

The failed-to-sending revival at Lines 169-193 returns before Lines 235-242 patch reticulumDeliveryAttempts. A sending cascade event can therefore clear the failure state but lose its attempt count in both the store and SQLite record.

The pending-before-rekey path also drops this field because bufferPendingDeliveryStatus() and flushPendingReticulumOutboundDeliveryStatus() do not carry deliveryAttempts.

Add the clamped value to the revival record and to the pending-status payload. Add regression tests for both paths.

As per coding guidelines, **/*.{ts,tsx} requires a passing test for behavioral changes before considering the task complete.

Also applies to: 304-315

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.ts` around
lines 161 - 162, Preserve the clamped deliveryAttempts value throughout
applyReticulumOutboundDeliveryStatus: include it when creating the
failed-to-sending revival record and pass it through bufferPendingDeliveryStatus
and flushPendingReticulumOutboundDeliveryStatus for pending-before-rekey
updates, so both store and SQLite persistence retain it. Add regression tests
covering the revival and pending-status paths.

Source: Coding guidelines

🧹 Nitpick comments (1)
src/renderer/lib/reticulum/reticulumPropagationEffective.test.ts (1)

71-88: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Add a negative case for a disabled local-prop row.

The suite covers "local-prop enabled → capacity true" and "empty list → capacity false". It does not cover a present but disabled local-prop row with no remote target. That case controls shouldApplyLinkDeliveryTimeoutFailureBridge: if the predicate wrongly returns true there, the timeout bridge stays suppressed and outbound messages never reach a failed state in the UI.

💚 Proposed test
   it('is false when nothing is available', () => {
     expect(hasReticulumPnCascadeCapacity([], null, 'off')).toBe(false);
   });
+
+  it('is false when local-prop is present but disabled and no remote exists', () => {
+    const localDisabled: PropagationNodeRow = {
+      id: 'local-prop',
+      name: 'Local',
+      enabled: false,
+      status: 'idle',
+    };
+    expect(hasEnabledLocalPropagation([localDisabled])).toBe(false);
+    expect(hasReticulumPnCascadeCapacity([localDisabled], null, 'auto')).toBe(false);
+  });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/lib/reticulum/reticulumPropagationEffective.test.ts` around
lines 71 - 88, Add a negative test in the hasReticulumPnCascadeCapacity suite
using a present but disabled local-prop row, with no remote target and
propagation mode off, and assert the predicate returns false. Keep the existing
enabled local-prop and empty-list cases unchanged.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@reticulum-sidecar/src/stack/lxmf_outbound.rs`:
- Around line 2086-2122: Add a behavioral test for the driver method
try_advance_pn_cascade, following
requeue_direct_after_path_failover_exhausts_then_clears_state as the setup and
invocation template. Configure preferred remote, next remote, and local
candidates, then verify successive Direct-failure advances update
pending_pn_targets in that order, set pn_cascade_local for the local step, and
return Err after exhaustion. Retain the existing source-contract test as an
additional guard if desired, without changing its asserted log strings.
- Around line 845-868: Update the victim-eviction branch in mark_pn_tried to
also remove the evicted message hash from pn_deposit_defer_counts, alongside
pn_cascade_tried, pn_cascade_local, and pending_pn_targets.

In `@reticulum-sidecar/src/stack/pn_cascade.rs`:
- Around line 116-123: In the local-prop branch of the cascade candidate
filtering, remove the redundant enabled_local computation and second guard. Use
the row’s enabled flag as the single source of truth for eligibility, so a
local-prop row is skipped whenever *enabled is false regardless of
local_prop_enabled; preserve candidate inclusion only when the row is enabled.
- Around line 124-128: The local cascade path must use the lxmf.propagation
destination rather than the local self-hash identity. In
reticulum-sidecar/src/stack/pn_cascade.rs:124-128, remove the self_norm fallback
and propagate the actual destination, or bypass propagation-link handling for
PnCascadePick::Local and store directly in the local inbox. Update the
corresponding local delivery handling in
reticulum-sidecar/src/stack/lxmf_outbound.rs:946-966 so deliver_propagated does
not perform identity/path checks against an incorrect Nomad target.

In `@src/renderer/lib/reticulum/catchUpRecentInboundLxmf.ts`:
- Around line 22-81: Scope the single-flight state by identityId instead of
using the global catchUpInFlight, catchUpInFlightOpts, and catchUpPending
variables. Update the catch-up orchestration to maintain independent in-flight,
options, and pending entries per identity so concurrent calls for different
identities never share promises or cursor/watermark outcomes, while preserving
coalescing for calls with the same identityId. Add coverage for overlapping
calls across two identities.

In `@src/renderer/runtime/useReticulumRuntime.ts`:
- Around line 1501-1562: Introduce a bridge-generation ref for the link-timeout
async flow around the bridge IIFE, capture its value before starting, and abort
the continuation after refreshFromSidecar() when the captured generation is
stale. Increment the generation on identity changes, tearDownFromSidecarStop(),
and disconnect(), alongside the existing propagationHydratedForBridgeRef resets,
and ensure the loop cannot call failReticulumSendingOutboundToDestHash after
invalidation. Add a delayed-hydration test covering sidecar stop or disconnect
before hydration completes.

---

Other comments:
In `@src/main/support-bundle.ts`:
- Around line 188-195: Update the diagnostics filter pattern list in the
support-bundle construction flow to include case-insensitive matching for
propagation-retrieve alongside propagation-deposit, and add a behavioral
assertion in the support-bundle tests confirming retrieval diagnostics are
retained. Preserve the existing filtering, redaction, and truncation behavior
for LXMF and PN cascade logs.

In `@src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.ts`:
- Around line 161-162: Preserve the clamped deliveryAttempts value throughout
applyReticulumOutboundDeliveryStatus: include it when creating the
failed-to-sending revival record and pass it through bufferPendingDeliveryStatus
and flushPendingReticulumOutboundDeliveryStatus for pending-before-rekey
updates, so both store and SQLite persistence retain it. Add regression tests
covering the revival and pending-status paths.

In `@src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.ts`:
- Around line 72-74: Update the backoff calculation around applyJitter so the
final jittered delay is clamped between DEFAULT_BACKOFF_MS and MAX_BACKOFF_MS
before assigning state.backoffUntilMs. Add tests covering jitter below the
minimum and above the maximum, while preserving the existing exponential backoff
behavior.

---

Nitpick comments:
In `@src/renderer/lib/reticulum/reticulumPropagationEffective.test.ts`:
- Around line 71-88: Add a negative test in the hasReticulumPnCascadeCapacity
suite using a present but disabled local-prop row, with no remote target and
propagation mode off, and assert the predicate returns false. Keep the existing
enabled local-prop and empty-list cases unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: QUIET

Plan: Pro Plus

Run ID: 2cfae4d6-04da-4a08-b881-4db0dcaf1086

📥 Commits

Reviewing files that changed from the base of the PR and between 53b0f13 and 8a16aa6.

⛔ Files ignored due to path filters (16)
  • src/renderer/locales/cs/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/de/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/en/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/es/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/fr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/id/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/it/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ja/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ko/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/nl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pl/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/pt-BR/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/ru/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/tr/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/uk/translation.json is excluded by !src/renderer/locales/**
  • src/renderer/locales/zh/translation.json is excluded by !src/renderer/locales/**
📒 Files selected for processing (42)
  • AGENTS.md
  • README.md
  • docs/reticulum-sidecar-ipc.md
  • docs/reticulum.md
  • docs/troubleshooting.md
  • reticulum-sidecar/src/stack/live.rs
  • reticulum-sidecar/src/stack/lxmf_outbound.rs
  • reticulum-sidecar/src/stack/mod.rs
  • reticulum-sidecar/src/stack/pn_cascade.rs
  • src/main/ipc/reticulum-handlers.ts
  • src/main/ipc/reticulum-proxy-rate-limit.contract.test.ts
  • src/main/ipc/reticulumLxmfRecentPath.ts
  • src/main/reticulum-proxy-path.ts
  • src/main/support-bundle.test.ts
  • src/main/support-bundle.ts
  • src/renderer/components/ReticulumMessageStatusBadge.test.tsx
  • src/renderer/components/ReticulumMessageStatusBadge.tsx
  • src/renderer/lib/ingest/reticulumIngest.ts
  • src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.test.ts
  • src/renderer/lib/reticulum/applyReticulumOutboundDeliveryStatus.ts
  • src/renderer/lib/reticulum/catchUpInboundLxmf.test.ts
  • src/renderer/lib/reticulum/catchUpRecentInboundLxmf.test.ts
  • src/renderer/lib/reticulum/catchUpRecentInboundLxmf.ts
  • src/renderer/lib/reticulum/fetchRecentInboundLxmf.test.ts
  • src/renderer/lib/reticulum/fetchRecentInboundLxmf.ts
  • src/renderer/lib/reticulum/reticulumOutboundFailureBridge.test.ts
  • src/renderer/lib/reticulum/reticulumOutboundFailureBridge.ts
  • src/renderer/lib/reticulum/reticulumPropagationEffective.test.ts
  • src/renderer/lib/reticulum/reticulumPropagationEffective.ts
  • src/renderer/lib/reticulum/reticulumPropagationSync.test.ts
  • src/renderer/lib/reticulum/reticulumPropagationSync.ts
  • src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.test.ts
  • src/renderer/lib/reticulum/reticulumProxyRateLimitBackoff.ts
  • src/renderer/runtime/useReticulumRuntime.reconnect-hardening.test.ts
  • src/renderer/runtime/useReticulumRuntime.ts
  • src/renderer/stores/messageStore.ts
  • src/renderer/stores/reticulumPeerStore.test.ts
  • src/renderer/stores/reticulumPeerStore.ts
  • src/shared/electron-api.types.ts
  • src/shared/reticulumApiPaths.ts
  • src/shared/reticulumDeliveryMethod.test.ts
  • src/shared/reticulumDeliveryMethod.ts

Comment thread reticulum-sidecar/src/stack/lxmf_outbound.rs
Comment thread reticulum-sidecar/src/stack/lxmf_outbound.rs
Comment thread reticulum-sidecar/src/stack/pn_cascade.rs Outdated
Comment thread reticulum-sidecar/src/stack/pn_cascade.rs Outdated
Comment thread src/renderer/lib/reticulum/catchUpRecentInboundLxmf.ts Outdated
Comment thread src/renderer/runtime/useReticulumRuntime.ts
Verify-and-fix: cascade eviction/local-prop dest, try_advance behavioral coverage, per-identity catch-up single-flight, bridge generation abort, deliveryAttempts persistence, jitter clamp, retrieve log slice, and cascade-capacity negative test.
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