detached 1fe4915

fix(remote): gate remote rows until activation

commit
1fe49150c8d8ff134072cfc04c28ac648118a773
author
brice · · 2026-07-31 15:56 UTC
parent
59f9ff5
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +4 -4
M internal/usecase/daemon/remote_picker.go +2 -2
@@ -122,7 +122,7 @@ func remotePickerView(key domain.RemoteSessionKey, session ports.RemoteCatalogSe
122122 RemoteAvailability: remotePickerAvailability(status),
123123 RemoteDetail: detail,
124124 ConnectOnly: true,
125- RemoteAttachReady: status != remoteHostVersionMismatch,
125+ RemoteAttachReady: false,
126126 CannotAcceptMoves: true,
127127 }
128128 }
@@ -155,7 +155,7 @@ func remoteProxyPickerView(key domain.RemoteSessionKey, snap sessionView) picker
155155 view.RemoteAvailability = picker.RemoteFresh
156156 view.RemoteDetail = remotePickerDetail(uint16(snap.tabCount))
157157 view.ConnectOnly = true
158- view.RemoteAttachReady = true
158+ view.RemoteAttachReady = false
159159 if snap.expired {
160160 view.RemoteAvailability = picker.RemoteStale
161161 view.RemoteDetail = "expired"
@@ -122,7 +122,7 @@ func remotePickerView(key domain.RemoteSessionKey, session ports.RemoteCatalogSe
122 RemoteAvailability: remotePickerAvailability(status),122 RemoteAvailability: remotePickerAvailability(status),
123 RemoteDetail: detail,123 RemoteDetail: detail,
124 ConnectOnly: true,124 ConnectOnly: true,
125- RemoteAttachReady: status != remoteHostVersionMismatch,125+ RemoteAttachReady: false,
126 CannotAcceptMoves: true,126 CannotAcceptMoves: true,
127 }127 }
128 }128 }
@@ -155,7 +155,7 @@ func remoteProxyPickerView(key domain.RemoteSessionKey, snap sessionView) picker
155 view.RemoteAvailability = picker.RemoteFresh155 view.RemoteAvailability = picker.RemoteFresh
156 view.RemoteDetail = remotePickerDetail(uint16(snap.tabCount))156 view.RemoteDetail = remotePickerDetail(uint16(snap.tabCount))
157 view.ConnectOnly = true157 view.ConnectOnly = true
158- view.RemoteAttachReady = true158+ view.RemoteAttachReady = false
159 if snap.expired {159 if snap.expired {
160 view.RemoteAvailability = picker.RemoteStale160 view.RemoteAvailability = picker.RemoteStale
161 view.RemoteDetail = "expired"161 view.RemoteDetail = "expired"
M internal/usecase/daemon/remote_picker_test.go +2 -2
@@ -497,7 +497,7 @@ func TestRemoteRefreshPreservesRemoteCursorAcrossCacheToProxyUpgrade(t *testing.
497497 owner.overlays.pickerMu.Unlock()
498498 require.True(t, ok)
499499 require.Equal(t, &key, before.RemoteKey)
500- require.True(t, beforeSelectable, "a reachable cache-derived remote row is selectable")
500+ require.False(t, beforeSelectable, "cache-derived remote row must stay gated until proxy activation lands")
501501
502502 proxy := &proxySession{
503503 sessionCore: sessionCore{id: key.ID(), name: key.Display()},
@@ -517,7 +517,7 @@ func TestRemoteRefreshPreservesRemoteCursorAcrossCacheToProxyUpgrade(t *testing.
517517 require.True(t, ok)
518518 require.Equal(t, before.Session, after.Session)
519519 require.Equal(t, before.RemoteKey, after.RemoteKey)
520- require.True(t, selectable, "the cache-to-live upgrade must not drop the row's selectability")
520+ require.False(t, selectable, "cache-to-live upgrade must preserve the proxy activation gate")
521521 }
522522
523523 func TestRemoteRefreshCancellationWhenLastPickerCloses(t *testing.T) {
@@ -497,7 +497,7 @@ func TestRemoteRefreshPreservesRemoteCursorAcrossCacheToProxyUpgrade(t *testing.
497 owner.overlays.pickerMu.Unlock()497 owner.overlays.pickerMu.Unlock()
498 require.True(t, ok)498 require.True(t, ok)
499 require.Equal(t, &key, before.RemoteKey)499 require.Equal(t, &key, before.RemoteKey)
500- require.True(t, beforeSelectable, "a reachable cache-derived remote row is selectable")500+ require.False(t, beforeSelectable, "cache-derived remote row must stay gated until proxy activation lands")
501 501
502 proxy := &proxySession{502 proxy := &proxySession{
503 sessionCore: sessionCore{id: key.ID(), name: key.Display()},503 sessionCore: sessionCore{id: key.ID(), name: key.Display()},
@@ -517,7 +517,7 @@ func TestRemoteRefreshPreservesRemoteCursorAcrossCacheToProxyUpgrade(t *testing.
517 require.True(t, ok)517 require.True(t, ok)
518 require.Equal(t, before.Session, after.Session)518 require.Equal(t, before.Session, after.Session)
519 require.Equal(t, before.RemoteKey, after.RemoteKey)519 require.Equal(t, before.RemoteKey, after.RemoteKey)
520- require.True(t, selectable, "the cache-to-live upgrade must not drop the row's selectability")520+ require.False(t, selectable, "cache-to-live upgrade must preserve the proxy activation gate")
521 }521 }
522 522
523 func TestRemoteRefreshCancellationWhenLastPickerCloses(t *testing.T) {523 func TestRemoteRefreshCancellationWhenLastPickerCloses(t *testing.T) {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close