fix(remote): gate remote rows until activation
- commit
- 1fe49150c8d8ff134072cfc04c28ac648118a773
- author
- brice · · 2026-07-31 15:56 UTC
- parent
- 59f9ff5
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· 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 | |||
| 122 | 122 | RemoteAvailability: remotePickerAvailability(status), | |
| 123 | 123 | RemoteDetail: detail, | |
| 124 | 124 | ConnectOnly: true, | |
| 125 | - | RemoteAttachReady: status != remoteHostVersionMismatch, | |
| 125 | + | RemoteAttachReady: false, | |
| 126 | 126 | CannotAcceptMoves: true, | |
| 127 | 127 | } | |
| 128 | 128 | } | |
| @@ -155,7 +155,7 @@ func remoteProxyPickerView(key domain.RemoteSessionKey, snap sessionView) picker | |||
| 155 | 155 | view.RemoteAvailability = picker.RemoteFresh | |
| 156 | 156 | view.RemoteDetail = remotePickerDetail(uint16(snap.tabCount)) | |
| 157 | 157 | view.ConnectOnly = true | |
| 158 | - | view.RemoteAttachReady = true | |
| 158 | + | view.RemoteAttachReady = false | |
| 159 | 159 | if snap.expired { | |
| 160 | 160 | view.RemoteAvailability = picker.RemoteStale | |
| 161 | 161 | 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.RemoteFresh | 155 | view.RemoteAvailability = picker.RemoteFresh | ||
| 156 | view.RemoteDetail = remotePickerDetail(uint16(snap.tabCount)) | 156 | view.RemoteDetail = remotePickerDetail(uint16(snap.tabCount)) | ||
| 157 | view.ConnectOnly = true | 157 | view.ConnectOnly = true | ||
| 158 | - | view.RemoteAttachReady = true | 158 | + | view.RemoteAttachReady = false |
| 159 | if snap.expired { | 159 | if snap.expired { | ||
| 160 | view.RemoteAvailability = picker.RemoteStale | 160 | 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. | |||
| 497 | 497 | owner.overlays.pickerMu.Unlock() | |
| 498 | 498 | require.True(t, ok) | |
| 499 | 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 | 502 | proxy := &proxySession{ | |
| 503 | 503 | sessionCore: sessionCore{id: key.ID(), name: key.Display()}, | |
| @@ -517,7 +517,7 @@ func TestRemoteRefreshPreservesRemoteCursorAcrossCacheToProxyUpgrade(t *testing. | |||
| 517 | 517 | require.True(t, ok) | |
| 518 | 518 | require.Equal(t, before.Session, after.Session) | |
| 519 | 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 | 523 | 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) { | ||