Skip to content

fix(mobile): hydrate peer presence before live heartbeat - #25

Draft
BrianInAz wants to merge 2 commits into
mainfrom
fix/ios-peer-presence-hydration
Draft

fix(mobile): hydrate peer presence before live heartbeat#25
BrianInAz wants to merge 2 commits into
mainfrom
fix/ios-peer-presence-hydration

Conversation

@BrianInAz

@BrianInAz BrianInAz commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Summary

  • hydrate tracked iOS peer presence immediately through the existing authenticated kind 20001 relay query
  • preserve live WebSocket updates as the fast path with race-safe snapshot merging
  • refresh tracked peers every 60 seconds and rehydrate immediately after reconnect
  • retain the existing public Map<String, String> provider contract and unchanged widgets
  • remediate the separately authorized pre-existing ChannelDetailPage tall-message anchor regression
  • add the Beads execution record and the as-built repository document

Root cause

iOS previously consumed only ephemeral live presence events. Events received before a DM pubkey was tracked were discarded, and ephemeral events are not stored or replayed, so an already-online Hermes peer remained gray until its next heartbeat. Relay connectivity and peer presence are separate signals.

TDD and validation

  • presence provider: 15 passed
  • ChannelDetailPage: 61 passed
  • full mobile suite: 1,107 passed, 1 intentional skip, 0 failed
  • Flutter analysis, Dart format, mobile file-size policy, and git diff checks: passed
  • full Hermit-backed repository just ci: passed locally
  • simulator acceptance: 5/5 cold launches and 5/5 foreground reconnect cycles showed both peer dots green within five seconds

Acceptance used only the isolated iOS 26.5 simulator and the worktree-specific debug bundle. The existing public Home Lab CA was trusted only in that simulator after explicit approval. The unbacked physical iOS 27 beta phone was not touched.

Evidence and tracking

Scope boundaries

No Desktop, CLI, relay, Hermes runtime, heartbeat, TTL, authentication, membership, or protocol changes are included. No Hermes identity or private device identifier is hardcoded or documented.

CI blocker

Workflow run 31370360522 was cancelled immediately after it unexpectedly started the GitHub-hosted macOS Desktop job. The path-filter log proves a pre-existing CI defect: the Desktop filter's standalone !desktop/src-tauri/** entry marks every changed file outside that directory—including mobile/docs/Beads-only changes—as Desktop scope.

This is tracked separately as Beads ios-buzz-59e.8. Repository policy forbids agent-started hosted macOS/Windows jobs, and the presence remediation forbids workarounds, so this run will not be rerun and the CI filter will not be changed in this PR. The PR remains draft pending explicit authorization for a separate TDD CI-filter remediation or a human decision on merge.

Signed-off-by: Brian Charbonneau <github@briancharbonneau.com>
@cursor

cursor Bot commented Aug 10, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

Signed-off-by: Brian Charbonneau <github@briancharbonneau.com>
@BrianInAz
BrianInAz marked this pull request as draft August 10, 2026 08:34
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