Repository navigation
Offer explicit fresh-shell recovery after session loss - #74
Merged
Merged
Conversation
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.
Changes
available transcript visible with copy-only command actions and an explicit Start fresh shell.
as credential-free connection metadata. Recovery opens sign-in again and uses current host-key
verification. It never reconnects or replays a command automatically.
process may still be running; recovery does not claim it was killed or resumed.
session/archive. Discard abandoned queued input so it cannot fill the fresh bootstrap slot.
Guard stale input, resize, and disconnect events against the current session.
Transport-loss finding
The new real Android/OpenSSH regression crashed the app with sshlib 0.4.2: a
Broken pipeescapedthe receive-window delivery coroutine at
SessionChannel.deliverData/sendWindowAdjust.That separate library coroutine bypasses the application's output-reader error handling (#73).
Use the released sshlib 0.5.0 writer/teardown path. Keep the previous 64 KiB receive-window bound
explicitly. All 31 added SHA-256 pins match fresh Maven Central downloads and their published
checksums; existing pins and verification configuration are preserved. Strict verification passed.
Validation
ended shell releases its transport before another connectionregression timed out waiting for transport cleanup../gradlew --no-daemon test lint assembleDebug assembleRelease assembleDebugAndroidTestpassed:114 local JVM tests, zero failures. The three opt-in SSH JVM tests skip without fixture credentials.
./scripts/verify-release-shrinker-contracts.shpassed../fixtures/openssh/test-adapter.sh: all three real JVM adapter tests passed with 0.5.0../fixtures/openssh/test-android-structured.sh: all five real Android SSH tests passed, includingencrypted imported-key authentication, existing structured/raw command behavior, replies,
bootstrap downgrade, exit, exec, strict failure, and transport loss. Recovery exercised nine
failure/reconnect cycles, including five 128 KiB output bursts followed by an abrupt drop.
Each cycle retained its own archive, started in a fresh shell, and sent only bootstrap on reconnect.
SessionRecoveryTestCompose tests passed: read-only context and explicit action at200% font scale, distinct network state, raw downgrade, original key/username selection even
after identity edits, permission recovery, fresh saved-password unlock, and cleared manual password.
an overlapping failed service preparation, stale-event isolation, and no command replay. The new
full-input-queue regression first timed out waiting for the fresh bootstrap; discarding abandoned
queued input makes it pass.
connectedDebugAndroidTest: 139 test cases, zero failures, nine prerequisite oropt-in skips. The five real SSH fixture tests were run separately with their prerequisites.
The first CI attempt on final head
522baa9passed the JVM, lint, debug/release build, and releaseshrinker checks, then timed out in four existing Android IME-visibility tests. The preceding revision
passed CI with the same UI/test sources, and both full local Android suites passed. The four methods
also passed together on a restarted local emulator with the hardware-keyboard IME policy disabled;
that hypothesis did not reproduce the failure. The cause remains unconfirmed and is tracked in #75.
The same-commit CI rerun
passed the complete verification job on
522baa9, including the Android suite. Thefirst failed attempt
remains linked in #75; the green retry does not establish why its keyboard was missing.
Signed physical-phone acceptance has not been run.
Closes #50.
Closes #73.