Skip to content

fix(settings): keep a chosen Thunderbolt Bridge pairing address - #24358

Open
innocarpe wants to merge 6 commits into
stablyai:mainfrom
innocarpe:fix-15980-thunderbolt-bridge-pairing
Open

innocarpe wants to merge 6 commits into
stablyai:mainfrom
innocarpe:fix-15980-thunderbolt-bridge-pairing

Conversation

@innocarpe

@innocarpe innocarpe commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

A Mac should keep using the Thunderbolt address chosen in Share this host after a brief disconnect. If that interface is away, do not create a new link for its old address.

What Changed

  • Limit macOS bridgeN recognition to Share this host. Generic auto-pairing continues to filter bridge addresses, so mobile QR defaults do not move to Thunderbolt.
  • Keep the chosen interface and address while it is absent. When the same interface returns with a new IP, select and save that current address.
  • Disable new access-link generation while the selected interface is absent, and explain that it must reconnect first.

Why

A brief link drop must not silently switch a new pairing link to Ethernet. Reusing an address after the chosen interface returns with a different IP can also target the wrong machine.

Linked Issue

Fixes #15980

Visual Proof

Synthetic component preview with mocked interfaces (not a live Thunderbolt hardware test). The first image shows bridge0 present and link generation enabled; the second keeps its address visible while it is missing and disables new link generation.

Testing

  • Updated focused Vitest suites: 59 tests passed across five files, including bridge0 present → absent → new IP → absent.

  • Changed-file oxlint --deny-warnings passed.

  • oxfmt --check passed for the changed formatted files.

  • Web TypeScript check passed with node node_modules/typescript/bin/tsc --noEmit -p config/tsconfig.tc.web.json.

  • git diff --check passed.

  • Manual two-Mac Thunderbolt test and full app build were not run.

  • I manually tested these changes locally

  • Automated tests added/updated

AI Disclosure

OpenAI Codex assisted with implementation and verification.

Review

  • The mobile-selection changes flagged as out of scope were removed; the shared automatic selector still filters bridge*.
  • The stale-address sequence now has a regression test, and the UI refuses a new link while the selected interface is missing.
  • The automated Docstring Coverage warning remains. I kept the patch focused instead of adding boilerplate docstrings to unrelated touched functions.

Agent skill upstream boundary

  • Not applicable; this change does not modify agent skills.

Notes

The screenshots use synthetic interface lists. No live macOS Thunderbolt hardware result is claimed.
orca-share-host-before
orca-share-host-after

@greptile-apps

greptile-apps Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Medium risk] Saves and restores user's chosen network interface for device pairing.

The PR appears safe to merge; no new actionable issue or outstanding previous finding was identified.

Summary

The PR retains a chosen Share this host interface and address across refreshes and launches, while allowing macOS Thunderbolt Bridge as a direct-address fallback. The latest changes make mobile pairing switch away from an automatically selected Thunderbolt address when Ethernet becomes available and supply the platform API in affected test fixtures.

Reviews (4) · Last reviewed commit: "fix(settings): replace an auto-selected ..."

Comment thread src/shared/pairing-address-auto-selection.ts Outdated
Comment thread src/renderer/src/components/settings/use-runtime-pairing-advertised-address.ts Outdated
@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
🧰 Additional context used
📚 Code guidelines (1)
AGENTS.md — auto-discovered

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 7249a6be-8338-4314-bab3-e7f47a2a02ab
📥 Commits

Reviewing files that changed from the base of the PR and between ca1fe81f5f2258338cc2ea6f0af57b8457efb667 and 21e0373.

📒 Files selected for processing (9)
  • src/renderer/src/components/settings/RuntimePairingGeneratorForm.test.tsx
  • src/renderer/src/components/settings/RuntimePairingGeneratorForm.tsx
  • src/renderer/src/components/settings/RuntimePairingUrlGenerator.test.tsx
  • src/renderer/src/components/settings/runtime-pairing-link-state.test.ts
  • src/renderer/src/components/settings/runtime-pairing-link-state.ts
  • src/renderer/src/i18n/locales/en.json
  • src/shared/global-settings-types.ts
  • src/shared/pairing-address-auto-selection.test.ts
  • src/shared/pairing-address-auto-selection.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

The pairing address selector now recognizes macOS Thunderbolt Bridge interfaces and uses saved interface preferences when choosing an address. The renderer persists the selected interface name and its last advertised address, and retains that selection when interface discovery changes. The generator form keeps an unavailable selected address visible, blocks link generation for that unavailable interface, and displays a reconnect message. Custom-address validation remains in place.

Priority: ➖ Normal

Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to 21e03

The change keeps a chosen Thunderbolt Bridge address selected and blocks link generation while that interface is unavailable. No merge-blocking risk remains in the supplied evidence. The manual two-Mac Thunderbolt test and full app build were not run.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 21e03

The change reduces accidental pairing with an unintended address. No newly introduced security defect was established, but saved-selection recovery and connection changes during link creation remain partially verified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The traced sensitive outcome is a runtime-scoped bearer grant for the shared host. The reviewed preference flow selects that host's advertised endpoint; it does not establish additional tenant, cloud-account or secret-management authority.

Trust Boundaries and Controls

  • observed — The unavailable-interface gate protects the normal form path, not the main IPC boundary. Main accepts a supplied address without checking retained interface availability. This leaves direct invocation and disconnect-during-generation outside the new gate; their newly attacker-controlled reachability was not established.

Resilience and Maintainability Implications

  • observed — Disappearance blocks new generation but does not automatically revoke existing grants. A previously generated link can remain displayed as current while its retained address is unchanged; returning with a different IP makes it stale. Runtime grant listing and revocation operations remain available.

Hardening Proposals

  • proposed — If interface affinity is intended as an enforceable creation guarantee rather than a discovery-time preference, define an explicit interface-selection contract and validate it at offer creation while preserving deliberate Custom address and tunnel use.
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning Issue [#15980] requires Share this host to retain a chosen macOS bridgeN interface across restarts and dropouts, and not to reject Thunderbolt Bridge as a container bridge during automatic selection… Update Share this host automatic selection so macOS bridgeN can be selected when an eligible Ethernet interface is also present, while keeping unrelated generic/mobile automatic selection behavior unchanged. Add a regression test for that…
Docstring Coverage ⚠️ Warning Docstring coverage is 6.25% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 16 functions across 17 files. (1 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: preserving a chosen Thunderbolt Bridge pairing address.
Description check ✅ Passed The description covers the user-facing change, rationale, linked issue, visual proof, testing, AI disclosure, and review notes. It also states that live Thunderbolt testing and the full app build were…
Out of Scope Changes check ✅ Passed The reviewed changes support [#15980]. The new persistence, interface-resolution, unavailable-interface UI, platform detection, and tests implement the Share this host behavior. The shared selector re…
Full details: Linked Issues check

Explanation

Issue [#15980] requires Share this host to retain a chosen macOS bridgeN interface across restarts and dropouts, and not to reject Thunderbolt Bridge as a container bridge during automatic selection. The saved interface name and address, dropout retention, current-address restoration, and unavailable-interface generation guard are implemented. However, resolveAnotherDevicePairingAddress calls selectAutoAdvertisedPairingAddress before its Thunderbolt fallback. When Ethernet is eligible, the automatic choice remains Ethernet and bridgeN is not considered. The reported runtime tests also expect Ethernet when no preference exists.

Resolution

Update Share this host automatic selection so macOS bridgeN can be selected when an eligible Ethernet interface is also present, while keeping unrelated generic/mobile automatic selection behavior unchanged. Add a regression test for that interface combination.

Full details: Docstring Coverage

Explanation

Docstring coverage is 6.25% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 16 functions across 17 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 085d0771-0855-4a42-8345-e491360a880e

📥 Commits

Reviewing files that changed from the base of the PR and between 14d4bb2 and b2b8ab33a062fde8d3b1e587474959a9daf71cfc.

📒 Files selected for processing (10)
  • src/main/runtime/pairing-network-interfaces.ts
  • src/renderer/src/components/settings/RuntimePairingGeneratorForm.tsx
  • src/renderer/src/components/settings/RuntimePairingUrlGenerator.test.tsx
  • src/renderer/src/components/settings/RuntimePairingUrlGenerator.tsx
  • src/renderer/src/components/settings/runtime-pairing-link-state.test.ts
  • src/renderer/src/components/settings/runtime-pairing-link-state.ts
  • src/renderer/src/components/settings/use-runtime-pairing-advertised-address.ts
  • src/shared/global-settings-types.ts
  • src/shared/pairing-address-auto-selection.test.ts
  • src/shared/pairing-address-auto-selection.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 2 remain after this review.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

A retained Thunderbolt pick can revert to a superseded, unreachable address after the interface returns with a changed address and then drops. One inline comment.

Reviewed changes

  • bridgeN is no longer a container bridge — new isThunderboltBridgeInterface (/^bridge\d+$/i) exempts macOS bridgeN from isVirtualBridgeInterface, while bare bridge, br-, docker0, and virbr stay excluded. rankInterface gives bridgeN a +2 penalty so it sorts behind LAN/IPv6.
  • Auto-advertise fallback — selectAutoAdvertisedPairingAddress now uses a Thunderbolt address only after tailnet and every non-Thunderbolt direct address are exhausted.
  • Remembered "Another device" pick — two new GlobalSettings fields plus a module-level cache; a new resolveAnotherDevicePairingAddress restores the saved interface across restarts and keeps the remembered address when the interface is briefly absent from a refresh.
  • Retained picker row — RuntimePairingGeneratorForm appends a down interface as a selectable row so the choice stays visible.
  • Extracted hook — the restore effect and the updateSelectedAddress / updateIntent mutators move out of RuntimePairingUrlGenerator into useRuntimePairingAdvertisedAddress.

ℹ️ Mobile QR now advertises bridgeN on a bridge-only host

selectAutoAdvertisedPairingAddress is shared with the mobile QR path, which this PR does not touch. Because bridgeN is no longer filtered, getDefaultPairingAddress() on a host whose only interface is Thunderbolt Bridge now returns the cable address instead of undefined, so mobile:getPairingQR advertises it under both Relay and local-only. The PR body lists "mobile QR defaults" as out of scope and says they "still skip docker and host-local virtual switches"; that is true for docker0/vEthernet, but bridgeN is no longer skipped, and no mobile test covers a bridge0-only host (the existing bridge tests all use docker0/vEthernet). The "user-regression-tradeoffs" section does acknowledge that a cable-only Mac now mints a direct address, so this may be intended — worth confirming that the phone-QR surface is meant to change too, and adjusting the scope wording or adding a mobile test if so.

Technical details
# Mobile QR path adopts the Thunderbolt address on bridge-only hosts

## Affected sites
- `src/shared/pairing-address-auto-selection.ts:55-56` — the `advertisable[0]` fallback now returns `bridgeN`.
- `src/main/runtime/pairing-network-interfaces.ts:76-84` — `getDefaultPairingAddress` feeds this to the mobile QR.
- `src/main/ipc/mobile.ts:92,97-104,141` — bridge-only `local-only` no longer fails closed; Relay gets a non-null endpoint.
- `src/renderer/src/components/settings/mobile-network-interface-selection.ts:34,40` — `selectRefreshedNetworkAddress(undefined, [bridge0])` now returns the cable address instead of `undefined`.

## Required outcome
- Decide whether the phone QR should advertise Thunderbolt Bridge on a bridge-only host. If yes, add a `bridge0`-only case to `src/main/ipc/mobile.test.ts` (the current "never auto-advertises a bridge" tests use `docker0`/`vEthernet`) and correct the "mobile ... out of scope" claim. If no, gate the fallback so the mobile path keeps failing closed.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@innocarpe
innocarpe force-pushed the fix-15980-thunderbolt-bridge-pairing branch from b2b8ab3 to d3b9bca Compare October 1, 2026 12:36
@innocarpe

Copy link
Copy Markdown
Contributor Author

Sync update (d3b9bca4f9)

Linux bridge0 is no longer treated as a Thunderbolt link. A saved interface that returns with a new IP is remembered, and an empty discovery still restores the saved address.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

The shared address helpers now default platform to process.platform, but sandboxed renderer code calls them — opening "Share this host" on a fresh install or the mobile pairing picker throws ReferenceError: process is not defined. One inline comment.

Reviewed changes

  • Platform-gated the Thunderbolt classifier — isThunderboltBridgeInterface(name, platform) now matches bridgeN only on darwin, so Linux bridge0 is filtered as a virtual bridge again; selectAutoAdvertisedPairingAddress threads the platform through.
  • Remembered a changed interface address — the restore effect rewrites the cached/persisted advertised{InterfaceName,Address} when the remembered interface reappears with a new address, so a later drop can no longer resurrect a superseded value.
  • Restored the saved address on empty discovery — an empty interface list re-selects the remembered address instead of clearing it.
  • Added regression tests — Linux bridge0 filtering, empty-discovery restore, and a changed address on the saved interface.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

Comment thread src/shared/pairing-address-auto-selection.ts Outdated
@innocarpe

Copy link
Copy Markdown
Contributor Author

Sync update (75209e9b93)

The pairing picker takes the host platform from its caller. The sandboxed renderer no longer reads process, so a macOS Thunderbolt Bridge address still matches the one main already advertised.

Comment thread src/renderer/src/components/settings/mobile-network-interface-selection.ts Outdated
Comment thread src/renderer/src/components/settings/read-pairing-host-platform.ts

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Making platform a required argument fixes the sandboxed-renderer crash, but it breaks two existing test suites. MobilePage.test.tsx and MobilePane.test.tsx build a window.api mock without a platform key, so the new readPairingHostPlatform() throws and ten tests fail. Details below.

Reviewed changes

  • Made the host platform a required argument on isThunderboltBridgeInterface, isVirtualBridgeInterface, and selectAutoAdvertisedPairingAddress, removing the process.platform defaults that crashed the sandboxed renderer.
  • Threaded the platform through every call site: the main process passes process.platform, and renderer call sites read window.api.platform.get().platform through the new readPairingHostPlatform.
  • Added a regression test that deletes globalThis.process and asserts the mobile picker still resolves the right address without it.

⚠️ Two existing suites fail: window.api mocks omit platform

readPairingHostPlatform() throws when the platform API is absent, and two suites that render the mobile pairing picker define window.api without a platform key. Their refresh/remove flows reach selectRefreshedNetworkAddress with non-empty interfaces, so the helper throws and the selection never lands — ten tests fail (seven in MobilePage.test.tsx, three in MobilePane.test.tsx). Both files pass at the prior commit (d3b9bca, 52 tests), so the new commit introduced the regression.

Technical details
# New required `platform` breaks MobilePage/MobilePane tests

## Affected sites
- `src/renderer/src/components/mobile/MobilePage.test.tsx:167-178` — `window.api` mock has no `platform`.
- `src/renderer/src/components/settings/MobilePane.test.tsx:195-206` — same.
- `src/renderer/src/components/settings/read-pairing-host-platform.ts:7-9` — throws when the platform API is absent.
- `src/renderer/src/components/settings/mobile-network-interface-selection.ts:33` — `selectRefreshedNetworkAddress` now calls `readPairingHostPlatform()` for non-empty refreshes.

## Failing tests
- `MobilePage.test.tsx`: "removes the active custom address and remints with a discovered fallback" (542), "mints one offer when Continue lands while the address refresh is in flight" (567), "mints \"Pair another device\" against the resolved address, not the default" (646), "waits for the newest lookup when the flow is re-entered mid-refresh" (719), "does not release the mint when a superseded lookup for the same visit settles" (764), "does not re-block Step 2 when an abandoned visit's lookup settles last" (811), "ignores an interface lookup that settles after a newer one" (837).
- `MobilePane.test.tsx`: "lets LAN recover immediately while a Relay retry is unresolved" (390), "keeps the current pairing code when only custom address intent changes" (531), "removes the selected custom address and falls back to discovery" (558).

## Evidence
- At `d3b9bca`: `MobilePage.test.tsx` + `MobilePane.test.tsx` = 52 passed.
- At `75209e9`: 10 failed / 42 passed.
- Adding `platform: { get: () => ({ platform: 'darwin' as const }) }` to both `window.api` mocks → 52 passed again.

## Required outcome
- Give both `window.api` mocks a `platform.get()` returning a host platform, matching the stubs this commit already added to `use-mobile-pairing-address-preference.test.tsx` and `RuntimePairingUrlGenerator.test.tsx`.
- Do not instead soften `readPairingHostPlatform()` with a constant fallback — the prior review's requirement (the renderer must not guess, or it diverges from main's QR) still holds.

## Note
- The PR body's evidence command lists five files but not these two, which is why the regression was not caught.

Pullfrog  | Fix it ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@innocarpe
innocarpe force-pushed the fix-15980-thunderbolt-bridge-pairing branch from 75209e9 to ca1fe81 Compare October 1, 2026 13:34
@innocarpe

Copy link
Copy Markdown
Contributor Author

Sync update (ca1fe81f5f)

An auto-selected Thunderbolt address is replaced when Ethernet appears. An address the user picked stays, and the mobile page fixtures now provide the host platform the picker reads.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues — oxfmt wants three lines split in the two repaired test files.

Reviewed changes

Reviewed the delta since the prior pullfrog review (75209e9 → ca1fe81): the mobile picker's refresh path now drops an auto-selected Thunderbolt address when a direct interface appears, and the two suites that regressed when platform became required are repaired.

  • Auto-selected Thunderbolt yields to Ethernet — selectRefreshedNetworkAddress no longer keeps a current address that sits on a Thunderbolt interface unless the user chose it, so selectAutoAdvertisedPairingAddress re-runs and prefers a direct link that has appeared.
  • Explicit picks preserved — an address the user selected stays put even when Ethernet appears.
  • Regression tests added — auto-replace, explicit-keep, and a process-less renderer case in mobile-network-interface-selection.test.ts.
  • Prior [!IMPORTANT] addressed — MobilePage.test.tsx and MobilePane.test.tsx now give their window.api mock a platform.get(), so the previously failing ten tests pass (verified: 73 tests across the three touched suites).

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

Comment thread src/renderer/src/components/mobile/MobilePage.test.tsx Outdated
Comment thread src/renderer/src/components/settings/MobilePane.test.tsx Outdated
Comment thread src/renderer/src/components/settings/MobilePane.test.tsx Outdated
macOS names the Thunderbolt cable bridge0, so Share this host treated it as a
container bridge and replaced an explicit pick with en0 when the link dropped
or the app restarted. Remember the chosen interface and keep that address
while it is briefly missing. Auto-advertise still prefers a LAN or tailnet
address when one exists.

Fixes stablyai#15980
…idge0

Linux bridge0 is a virtual bridge, so it is no longer advertised as a direct pairing address. A saved interface that comes back with a new IP is remembered, and an empty discovery still restores the saved address.
The sandboxed renderer has no process global. Reading process.platform
as a default crashes the pairing picker, and guessing a platform would
advertise a different address from the one main already put on the QR.
…rnet appears

An automatic bridge0 pick is only the fallback while it is the only
direct link. A later Ethernet interface takes over, and an address the
user chose stays. The mobile page fixtures now supply the host platform
the picker reads.
@innocarpe
innocarpe force-pushed the fix-15980-thunderbolt-bridge-pairing branch from ca1fe81 to 1dce410 Compare October 4, 2026 17:55

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The new translate key added by 1dce410 is missing from en.json, so the localization extraction gate fails. I reproduced it locally.

Reviewed changes

Reviewed the delta since the prior pullfrog review (ca1fe81 → 1dce410, one new commit): the "Another device" path now treats Thunderbolt Bridge as explicit-only and blocks link generation while the chosen interface is absent.

  • Thunderbolt Bridge folded back into the virtual-bridge filter — isVirtualBridgeInterface dropped its platform argument and again matches bridgeN on every platform, so selectAutoAdvertisedPairingAddress (and the main-process QR) never auto-selects the cable; rankInterface keeps its +2 penalty through the same predicate.
  • Explicit bridgeN fallback moved to Share this host — resolveAnotherDevicePairingAddress appends a darwin-only Thunderbolt lookup after the shared selector, so a bridge-only host still resolves a direct address for "Another device".
  • Stale retained address can no longer mint a link — RuntimePairingGeneratorForm gained a retainedInterfaceName prop and gates canGenerate on the selected interface being present, with an inline alert when it is not.
  • Platform threading reverted in the renderer — selectRefreshedNetworkAddress and the mobile preference hook no longer read the host platform, and the platform.get() stubs are removed from MobilePage.test.tsx / MobilePane.test.tsx.
  • Tests added — the changed-then-dropped Bridge sequence, the bridge-only Share-this-host fallback, and the disabled-generate form case (64 tests pass across the six touched suites).

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

Reviewed the delta since the prior pullfrog review (1dce410 → 21e0373, one new commit): the missing localization copy is added, clearing the prior [!IMPORTANT].

  • Added the retained-interface warning copy — auto.components.settings.RuntimePairingUrlGenerator.selectedInterfaceUnavailable now exists in the RuntimePairingUrlGenerator object in en.json, matching the translate(...) call in RuntimePairingGeneratorForm.tsx:322. pnpm run verify:localization-extraction passes locally (Extracted 13538 keys). No behavioral change — the component already supplied an inline English fallback.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Share-this-host pairing forgets Thunderbolt Bridge (bridge0) and snaps back to en0

1 participant