Repository navigation
fix(android): release Gateway directory bootstrap - #578
Merged
Merged
Conversation
This was referenced Sep 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Refs #495 and #528. Follow-up to #571.
Android 1.16.0 admitted foreground Gateway observation before
gateway.ready, but production still deferred that socket behind the exact profile-scoped Dashboard session directory.HermesRuntimeBinderstarted the directory fromactiveEndpoint, which belongs to the optional Relay socket and remains null on a valid Dashboard-only LAN connection. The directory and Gateway could therefore wait on each other until a lifecycle or route change retriggered binding.Start the directory from the effective Dashboard origin instead. This preserves the existing profile-settle fence and directory ownership checks while allowing a standard Dashboard-only connection to reach the passive Gateway observation socket without a background/resume cycle.
Changes
effectiveDashboardUrl, not the optional Relay endpoint.session.resume,session.activate,prompt.submit, orsession.interrupt.Verification
Exact PR head:
68fce1b1dabe1a8dd1f9f6a7a1999938dd1d09bb.scripts/android-lane.ps1 gradle :app:testSideloadDebugUnitTest --tests 'com.hermesandroid.relay.runtime.HermesRuntimeBinderSessionDirectoryPolicyTest' --tests 'com.hermesandroid.relay.viewmodel.ChatViewModelGatewayInboundTurnTest' --console=plain— 128 tests passed; zero failures/errors/skips.scripts/android-lane.ps1 gradle :app:testGooglePlayDebugUnitTest --tests 'com.hermesandroid.relay.runtime.HermesRuntimeBinderSessionDirectoryPolicyTest' --tests 'com.hermesandroid.relay.viewmodel.ChatViewModelGatewayInboundTurnTest' --console=plain— 128 tests passed; zero failures/errors/skips.scripts/android-lane.ps1 gradle :app:compileSideloadDebugAndroidTestKotlin --console=plain— passed.scripts/android-lane.ps1 gradle :app:standardPhoneApi36SideloadDebugAndroidTest '-Pandroid.testInstrumentationRunnerArguments.class=com.hermesandroid.relay.viewmodel.GatewayForegroundRecoveryInstrumentedTest#dashboardOnlyColdLaunch_waitsForExactDirectoryThenOpensObservationSocket' --rerun-tasks --console=plain— one API 36 test passed. The first invocation assembled successfully but the managed emulator package service returned an ADB streamed-install broken pipe and produced no test result; the clean retry is the claimed result.scripts/android-lane.ps1 gradle :app:lintSideloadDebug :app:lintGooglePlayDebug :app:assembleSideloadDebug :app:assembleGooglePlayDebug --console=plain— passed.python -m unittest discover -s test-fixtures/vanilla-gateway/tests -p 'test_*.py'— 28 tests passed.python -m unittest scripts.tests.check_gateway_scenario_conformance_test— 8 tests passed.python scripts/check-gateway-scenario-conformance.py <clean-current-upstream> --scenario-manifest test-fixtures/vanilla-gateway/vanilla_gateway/scenarios/cold_start_observation.json— passed against cleanNousResearch/hermes-agentcommit6c3d4a4af70d76b7365bf19e9420ffdcbb9830ad; Gateway runtime and provider calls were not started.python scripts/check-android-locales.py— 12 catalogs passed.python scripts/check-user-docs-locales.py— five locales and five core pages passed.python scripts/check-android-collection-apis.py— passed.python scripts/check-android-release-notes.py— passed.python scripts/check-version-tracks.py— passed.git diff --check— passed.Screenshots
No visual change.
Compatibility / risk
Current upstream keeps authenticated
GET /api/sessions?profile=..., ticket minting,/api/ws,gateway.ready, andsession.active_listindependent. The official Dashboard/Desktop path opens the socket directly and reserves resume/activate for explicit session ownership. This change keeps Android on those upstream surfaces and adds no Hermes-Relay Plugin dependency or API/SSE fallback.Route/credential ownership, profile/session generations, drafts/history, terminal auth and unsupported dispositions, bounded reconnect cooldowns, and lifecycle recovery are unchanged. The cold path remains socket-only after the exact directory barrier.
Physical Android 16 LAN/Tailscale certification remains outstanding. No phone install, release, deployment, merge, or issue mutation was performed.
Lineage / contributor credit
Checklist
dev, unless this is adev→mainrelease PR or a focused production-tag hotfix PR tomainCHANGELOG.mdis updated for user-visible changes