Skip to content

fix(desktop): keep the attached server through a stall - #1721

Merged
donjor merged 4 commits into
hyprwsfrom
t3/attached-primary-grace
Oct 12, 2026
Merged

donjor merged 4 commits into
hyprwsfrom
t3/attached-primary-grace

Conversation

@donjor-agent

@donjor-agent donjor-agent Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

🤖 claude/anthropic claude-opus-5-5 (high)

Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

Change

All in DesktopAttachedPrimary.ts.

Grace

  • No answer: keep the attachment for 30 s
  • Grace start: the first failed verify
  • Grace reset: any verify that answers
  • Late older verify: cannot reset the grace
  • Held URL answers as itself: counts as verified

Bearer reads

  • In grace: keep the held bearer
  • Failed session check: keep the held bearer
  • authenticated: false: re-mint, as before

Drops at once

  • Another environment: on the held URL
  • Undiscoverable server: probe the held URL
  • Moved port: before any descriptor fetch
  • Also: a renderer reject

Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

Verification

Tests

  • Unit tests: 28 of 28 pass
  • New tests: stall, session, late, recovery
  • Harness: six inline fakes now share one
  • Test file: 881 lines, down from 896
  • Mutation check: each fails without its fix
  • Updated test: a gone server drops after 30 s

Checks

  • Typecheck: apps/desktop, exit 0
  • Fork CI: vp run fork:ci, exit 0
  • Not checked: a live stall in the desktop app

Claude Code, claude-opus-5-5.

Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no

A server that misses one 2s discovery probe no longer drops the
attachment, re-pairs, and remounts every window: silent verifies get a
30s grace, while a different environment or a moved port still drops.

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
@rsi-software-agent

rsi-software-agent Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

🩺 Aftercare b3bc960 ✅ clear

resolved 6

commit fb4c0d6

  • A1 Discovery filtering hides environment mismatches from immediate-drop logic ✅ 03df527
  • A2 In-flight bearer reads can drop an attachment during grace ✅ 03df527
  • A3 Older successful verifies can erase a newer grace deadline ✅ 03df527

commit 03df527

  • A4 Successful held-URL probes do not reset the silence grace ✅ 493c82b
  • A5 Known port moves receive grace when the follow-up descriptor fails ✅ 493c82b

commit 493c82b

  • A6 Split the now 1,036-line attachment test module ✅ b3bc960

🕐 12 Oct 03:17 UTC ⏱️ 9 min 🤖 gpt-6.1-sol 🪙 1.3M

⚠️ Not verified: Live Electron stall and native packaging unverified; full local fork:ci unavailable without upstream/main.

Details

A1 Discovery filtering hides environment mismatches from immediate-drop logic · apps/desktop/src/app/DesktopAttachedPrimary.ts:188

  • Problem: Filtered identity mismatches receive silence grace, retaining the wrong endpoint and bearer.
  • Fix: Preserve mismatch evidence or probe the held endpoint; test real discovery.
  • Note: Held-URL probing detects mismatches omitted by real discovery; regression passes.

A2 In-flight bearer reads can drop an attachment during grace · apps/desktop/src/app/DesktopAttachedPrimary.ts:442

  • Problem: Session timeouts still re-pair and drop after a background verify starts grace.
  • Fix: Recheck generation and grace after failed session/mint requests; add a racing-read test.
  • Note: In-flight session timeout preserves bearer and attachment without re-pairing; regression passes.

A3 Older successful verifies can erase a newer grace deadline · apps/desktop/src/app/DesktopAttachedPrimary.ts:362

  • Problem: Grace failures leave the watermark unchanged, allowing older successes to reset grace.
  • Fix: Advance the watermark for accepted grace failures; test out-of-order success.
  • Note: Grace failures advance the watermark, blocking older success resets; regression passes.

A4 Successful held-URL probes do not reset the silence grace · apps/desktop/src/app/DesktopAttachedPrimary.ts:195

  • Problem: Matching fallback responses count as unreachable, so recovered servers retain the old deadline.
  • Fix: Accept matching fallback responses as successful verification; test grace reset after recovery.
  • Note: Matching fallback responses now verify successfully and reset grace; previous regression passes.

A5 Known port moves receive grace when the follow-up descriptor fails · apps/desktop/src/app/DesktopAttachedPrimary.ts:380

  • Problem: Descriptor failures bypass the moved-port check, retaining an already superseded endpoint.
  • Fix: Reject discovered URL moves before the follow-up descriptor request; test request failure.
  • Note: Known URL moves fail before another descriptor request; previous regression passes.

A6 Split the now 1,036-line attachment test module · apps/desktop/src/app/DesktopAttachedPrimary.fork.test.ts:226

  • Problem: The oversized suite mixes substantial fixtures, lifecycle cases, and concurrency regressions, hindering navigation.
  • Fix: Extract shared fixtures and separate lifecycle from grace/concurrency tests without duplicating harnesses.
  • Note: Shared scenario reuse removes duplicated setup, shrinks the suite, and preserves behavior checks.
Head Result Time Check
b3bc960 ✅ clear · 1 fixed 9 min run
493c82b 🟡 1 open · 2 fixed · 1 new 7 min run
03df527 🔴 2 open · 3 fixed · 2 new 9 min run
fb4c0d6 🔴 3 open · 3 new 11 min run

…t failures

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
…port moves first

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
…rio harness

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
@donjor
donjor merged commit 3e105ca into hyprws Oct 12, 2026
@donjor
donjor deleted the t3/attached-primary-grace branch October 12, 2026 03:18
donjor added a commit that referenced this pull request Oct 12, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 12, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 12, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 12, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 12, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 13, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 13, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 15, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 15, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 15, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 15, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 16, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 16, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 16, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 16, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 18, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 18, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 18, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 18, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 20, 2026
Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor pushed a commit that referenced this pull request Oct 20, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 20, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 21, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 21, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 21, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 21, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 21, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 21, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 21, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 21, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 21, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 21, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 22, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 22, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 22, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 22, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 23, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 23, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 24, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 24, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 27, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 27, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 27, 2026
## Problem

A local server stalled for 3-5 s misses the 2 s discovery probe.
The desktop then drops the attachment, re-pairs, and remounts every window.
The remount's re-subscribe stalls the server again.

## Change

All in `DesktopAttachedPrimary.ts`.

### Grace

- **No answer:** keep the attachment for 30 s
- **Grace start:** the first failed verify
- **Grace reset:** any verify that answers
- **Late older verify:** cannot reset the grace
- **Held URL answers as itself:** counts as verified

### Bearer reads

- **In grace:** keep the held bearer
- **Failed session check:** keep the held bearer
- **`authenticated: false`:** re-mint, as before

### Drops at once

- **Another environment:** on the held URL
- **Undiscoverable server:** probe the held URL
- **Moved port:** before any descriptor fetch
- **Also:** a renderer reject

## Scope and approval

Refs #1720.
The maintainer asked for the desktop fix and the server fix.
The server stall cause stays open on the issue.

## Verification

### Tests

- **Unit tests:** 28 of 28 pass
- **New tests:** stall, session, late, recovery
- **Harness:** six inline fakes now share one
- **Test file:** 881 lines, down from 896
- **Mutation check:** each fails without its fix
- **Updated test:** a gone server drops after 30 s

### Checks

- **Typecheck:** `apps/desktop`, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a live stall in the desktop app

Claude Code, claude-opus-5-5.

## Fork trailers

Squashes:

- f8e0113 fix(desktop): keep the attached server through a stall (#1721) (#1721)
- 7b623a2 fixup! fix(desktop): keep the attached server through a stall (#1721) (#1721)

Fork-Domain: backend-attach
Fork-Tier: bugfix
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 27, 2026
…ses (#1724)

## Problem

No fork release has published since 2026-10-11 22:26 UTC.
Upstream re-pointed its moving `android-nightly` tag, and plain `git fetch --tags` refuses to overwrite a tag:

```text
! [rejected] android-nightly -> android-nightly  (would clobber existing tag)
```

That fetch fails in release preflight and in the upstream sync mirror, so neither has run since.
#1721, #1722, and #1723 have no build.

## Change

- **Release preflight:** `git fetch --tags --force`
- **Sync mirror fetch:** `git fetch --tags --force`
- **Sync mirror push:** `push --tags --force`
- **Local `fork:sync`:** same fetch flag
- **Doc:** `fork-sync.md` fetch row

Fork tags never share a name with an upstream tag, so forcing only moves upstream-owned tags.
The `main` push stays unforced.

## Scope and approval

The maintainer asked to land #1723 and stage its nightly; this unblocks that release.

## Verification

- **Repro:** plain fetch rejected, exit 1
- **Fix:** forced fetch updates the tag, exit 0
- **Fork CI:** `vp run fork:ci`, exit 0
- **Not checked:** a release run on this head

Claude Code, claude-opus-5-5.

## Fork trailers

Fork-Domain: fork-meta
Fork-Tier: bugfix
Fork-Upstreamable: no
Co-authored-by: donjor <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant