You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Every open PR merges cleanly into main on its own — GitHub reports all nineteen as MERGEABLE. They do not all merge cleanly into each other: six overlaps appear once they are landed in sequence, two of which git resolves silently and wrongly.
I merged all nineteen into one scratch tree to find out what actually breaks. The combined tree builds and passes: cargo test --workspace 189 passed / 0 failed, vitest run 369 passed across 43 files, vue-tsc --noEmit clean, check-comments.mjs{"ok":true,"count":0,"files":137}. So the set is compatible — this issue is only about the order and the resolutions.
#52 is not listed separately because #59 is stacked on it — git merge-base --is-ancestor confirms #59 contains #52's tip, so merging #59 lands both. Merging #52 first is fine and makes #59 a fast-forward of the overlap; merging #52after#59 is a no-op.
Nothing in 1–7, 16–18 conflicts with anything.
The conflicts, and how each resolves
A — #38, core/src/connection.rs. Both sides wrap the client::connect error. Keep both: the HostKeyMismatch passthrough (#38) and the negotiation hint (#29), with the hint applied to the other arm.
B — #59, core/src/connection.rs.#59 wraps the connect in tokio::time::timeout and switches Config::default() to client_config(). Keep that shape and put A's match in its inner map_err.
C — #59, desktop/src-tauri/Cargo.toml. Both append to [dev-dependencies]. Union: russh-keys, tauri = { features = ["test"] }, and the Linux zbus block.
D — #59, desktop/src-tauri/src/commands.rs. Two unrelated test modules both appended at EOF (known_host_confirmation_tests, connect_lock_tests). Union, each with its own closing braces. Same shape as I and as part of M.
E — #59, desktop/src-tauri/src/state.rs.#38 adds host_key_prompt, #59 replaces passphrase with vault_session. Keep host_key_promptandvault_session; passphrase is gone. Same in the constructor.
F — #58, desktop/src-tauri/src/vault_commands.rs.#58 clears state.passphrase; #59 replaced that with state.vault_session.clear().await. Keep the session clear, then #58's contain_open_sessions call. Union the imports.
G — #33, silent. Git merges biometric_commands.rs without complaint and it does not compile: the tests call state.passphrase (gone with E) and Vault::verify_passphrase / initialize, which #52 made async. authorize_biometric_disable becomes async and awaits verify_passphrase; clear_biometric_passphrase reads state.vault_session.passphrase().await; the four #[test]s become #[tokio::test].
H — #66, desktop/src-tauri/src/main.rs.#66 deletes check_for_updates_silent; #40 appends a test module right after it. Take the deletion, keep the tests.
I — #61, desktop/src-tauri/src/commands.rs. Test modules appended at EOF again (pty_dimension_tests against D's pair). Union.
J — #31, desktop/src-tauri/src/commands.rs imports. Union: host_key_prompt and LocalTerminals.
K — #31, create_local_terminal.#61 adds the checked pty_dimension conversion; #31 adds the reservation and release_on_err!. Both, with the dimension check first — a geometry that cannot be represented is refused before a slot is claimed, so there is nothing to give back — and PtySize { rows, cols, .. } taking the checked values.
L — #31, silent.contain_open_sessions (#58) is generic over &Mutex<HashMap<String, T>>; #31 replaces that map with LocalTerminals. It needs a clear() on LocalTerminals that drops live terminals and reservations — a reservation left behind holds a slot for a terminal nobody wants any more — and the signature becomes concrete. Its three tests build a LocalTerminals with one reservation rather than a one-entry HashMap.
M — #49, desktop/src-tauri/src/commands.rs. Four hunks. Union the imports; keep #31's fulfil block, then #49's channel and batching threads; the reader thread feeds the channel rather than emitting; the ownership flag guards only the closing notice.
That last point is worth stating on its own: with #49, output reaches the frontend on the session's ownChannel, so a stale reader physically cannot deliver into a replacement terminal. The half of #31's ownership flag that guards session-data becomes redundant, and only session-closed — which is still addressed by id alone — needs it.
N — #49, desktop/src-tauri/src/state.rs. Union: output_sinks alongside local_terminals: Mutex<LocalTerminals>, and unlocked_vault (from #59) kept.
O — #49, silent.#52's connect_lock_tests calls connect_ssh with seven arguments; #49 adds on_output: OutputSink. The test passes tauri::ipc::Channel::new(|_| Ok(())).
Two things this turned up
check-comments.mjs scanned nothing on a CRLF checkout before #70, so every clean run of it quoted in these PRs' descriptions was vacuous. Re-running the fixed scanner against all nineteen branch heads finds exactly two violations, both since fixed: one in #38 (connection.rs) and one in #63 (settings.ts).
Four of the fifteen overlaps — G, L, O, and the session-data half of M — are invisible to git. Anyone merging these should build and test after each one rather than trusting a clean merge.
Every open PR merges cleanly into
mainon its own — GitHub reports all nineteen asMERGEABLE. They do not all merge cleanly into each other: six overlaps appear once they are landed in sequence, two of which git resolves silently and wrongly.I merged all nineteen into one scratch tree to find out what actually breaks. The combined tree builds and passes:
cargo test --workspace189 passed / 0 failed,vitest run369 passed across 43 files,vue-tsc --noEmitclean,check-comments.mjs{"ok":true,"count":0,"files":137}. So the set is compatible — this issue is only about the order and the resolutions.Order that works
chore/greptile-pr-review-skillsfix/check-comments-crlf— early, so everything after it is actually scannedsecurity/harden-ci-supply-chainsecurity/windows-state-file-daclharden-webview-csp-and-shell-open-scopefix/persisted-state-integritysecurity/bound-russh-decompressionsecurity/host-key-change-confirmation— conflict Afix/vault-header-integrity— carries Keep the vault available and off the KDF during SSH connects #52; merging it merges Keep the vault available and off the KDF during SSH connects #52 — conflicts B, C, D, Esecurity/vault-reset-containment-and-key-material-clearing— conflict Fsecurity/gate-biometric-disable-and-trim-capabilities— silent break Gfix/single-update-check-path— conflict Hchore/trim-tokio-features-and-dead-commands— conflict Ifix/local-terminal-admission-guard— conflicts J, K; silent break Lperf/terminal-ipc-coalescing— conflicts M, N; silent break Operf/parallel-boot-loadsperf/frontend-bundle-sizeperf/terminal-webgl-renderer#52 is not listed separately because #59 is stacked on it —
git merge-base --is-ancestorconfirms #59 contains #52's tip, so merging #59 lands both. Merging #52 first is fine and makes #59 a fast-forward of the overlap; merging #52 after #59 is a no-op.Nothing in 1–7, 16–18 conflicts with anything.
The conflicts, and how each resolves
A — #38,
core/src/connection.rs. Both sides wrap theclient::connecterror. Keep both: theHostKeyMismatchpassthrough (#38) and the negotiation hint (#29), with the hint applied to theotherarm.B — #59,
core/src/connection.rs. #59 wraps the connect intokio::time::timeoutand switchesConfig::default()toclient_config(). Keep that shape and put A'smatchin its innermap_err.C — #59,
desktop/src-tauri/Cargo.toml. Both append to[dev-dependencies]. Union:russh-keys,tauri = { features = ["test"] }, and the Linuxzbusblock.D — #59,
desktop/src-tauri/src/commands.rs. Two unrelated test modules both appended at EOF (known_host_confirmation_tests,connect_lock_tests). Union, each with its own closing braces. Same shape as I and as part of M.E — #59,
desktop/src-tauri/src/state.rs. #38 addshost_key_prompt, #59 replacespassphrasewithvault_session. Keephost_key_promptandvault_session;passphraseis gone. Same in the constructor.F — #58,
desktop/src-tauri/src/vault_commands.rs. #58 clearsstate.passphrase; #59 replaced that withstate.vault_session.clear().await. Keep the session clear, then #58'scontain_open_sessionscall. Union the imports.G — #33, silent. Git merges
biometric_commands.rswithout complaint and it does not compile: the tests callstate.passphrase(gone with E) andVault::verify_passphrase/initialize, which #52 made async.authorize_biometric_disablebecomesasyncand awaitsverify_passphrase;clear_biometric_passphrasereadsstate.vault_session.passphrase().await; the four#[test]s become#[tokio::test].H — #66,
desktop/src-tauri/src/main.rs. #66 deletescheck_for_updates_silent; #40 appends a test module right after it. Take the deletion, keep the tests.I — #61,
desktop/src-tauri/src/commands.rs. Test modules appended at EOF again (pty_dimension_testsagainst D's pair). Union.J — #31,
desktop/src-tauri/src/commands.rsimports. Union:host_key_promptandLocalTerminals.K — #31,
create_local_terminal. #61 adds the checkedpty_dimensionconversion; #31 adds the reservation andrelease_on_err!. Both, with the dimension check first — a geometry that cannot be represented is refused before a slot is claimed, so there is nothing to give back — andPtySize { rows, cols, .. }taking the checked values.L — #31, silent.
contain_open_sessions(#58) is generic over&Mutex<HashMap<String, T>>; #31 replaces that map withLocalTerminals. It needs aclear()onLocalTerminalsthat drops live terminals and reservations — a reservation left behind holds a slot for a terminal nobody wants any more — and the signature becomes concrete. Its three tests build aLocalTerminalswith one reservation rather than a one-entryHashMap.M — #49,
desktop/src-tauri/src/commands.rs. Four hunks. Union the imports; keep #31'sfulfilblock, then #49's channel and batching threads; the reader thread feeds the channel rather than emitting; the ownership flag guards only the closing notice.That last point is worth stating on its own: with #49, output reaches the frontend on the session's own
Channel, so a stale reader physically cannot deliver into a replacement terminal. The half of #31's ownership flag that guardssession-databecomes redundant, and onlysession-closed— which is still addressed by id alone — needs it.N — #49,
desktop/src-tauri/src/state.rs. Union:output_sinksalongsidelocal_terminals: Mutex<LocalTerminals>, andunlocked_vault(from #59) kept.O — #49, silent. #52's
connect_lock_testscallsconnect_sshwith seven arguments; #49 addson_output: OutputSink. The test passestauri::ipc::Channel::new(|_| Ok(())).Two things this turned up
check-comments.mjsscanned nothing on a CRLF checkout before #70, so every clean run of it quoted in these PRs' descriptions was vacuous. Re-running the fixed scanner against all nineteen branch heads finds exactly two violations, both since fixed: one in #38 (connection.rs) and one in #63 (settings.ts).Four of the fifteen overlaps — G, L, O, and the
session-datahalf of M — are invisible to git. Anyone merging these should build and test after each one rather than trusting a clean merge.