Skip to content

feat(connect): encrypt paired-device traffic with pinned Noise XK - #2547

Merged
DoodleBears merged 14 commits into
mainfrom
codex/2542-connect-noise-xk
Oct 22, 2026
Merged

DoodleBears merged 14 commits into
mainfrom
codex/2542-connect-noise-xk

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Issue #2542 | Stack base #2546 | Agent claim

Requested by Vain; security choices approved by Vain. Implementation and verification: Codex.

Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141

Why the change

Connect needs an authenticated encrypted channel between the paired device and its Host so private input and normal app traffic can cross the tunnel without exposing their contents to the relay.

Special things to note

  • Stack: fix(connect): refuse secret entry and retire the phone full client #2546 merged as f267b7022951; this PR now targets main; the full phone WebView removal remains in Track A. New Connect pairings require independent Host fingerprint comparison and explicit approval of the device key. Existing unpinned Connect records refuse traffic and need re-pairing.
  • Merge risk: one-way door for deployed trust records, large blast radius across Host, browser, mobile and enrollment relay; rollback requires coordinated clients/Host recovery and Connect disablement or re-pairing, never plaintext fallback. Review key admission, replay/counter limits, resource bounds, cancellation and revocation. The fingerprint UI follow-up is reversible and does not alter keys or protocol; review full comparison, explicit trust and abort settlement. No database migration; the existing device public-key column is used.
  • Validation: security regression and prior full CI passed; real Cloudflare rejection/timeout/tampering/key mismatch/revocation refused without fallback. Trusted Web and rebuilt QA iOS27 private input passed failure, explicit retry and cleared success. Native first-pairing failure is now fixed: six light/dark × text-size cases and the Maestro interaction regression passed without post-pairing restart. Physical iPhone, Android, deployed account enrollment, Human QA and external audit remain unrun. Prior full CI is fully green for runtime source f73bb4ecb7eb (all three full test shards, static/build, mobile verification, Android native modules, docs, Host smoke and aggregate gate); the documentation-only 44d2d17d99d0 follow-up also passed its full CI. Vain explicitly authorized merge on 2026-10-22 and deferred the integrated Simulator checks to the shared post-merge batch, with screenshots to be added to this PR afterward; deployment remains outside scope. Current integration full CI passed for c1b1eec18b7e; merged into main as ebab8f9dcf78 on 2026-10-22. The earlier integrated run found unsupported example-domain fixtures in three newly merged test files; those positive-path fixtures now use supported Tailscale HTTPS routes, with 68 affected tests passing and production route refusal unchanged.

Change outline

Current main integration uses the canonical #2538 source-Host message/resource owner. Encrypted reads do not fall back to direct fetch; private input uses the owning client’s encryption capability. Delayed request/stream callbacks check their concrete instance before cleanup. Integration security report maps the additional #2542 criteria to receiving-endpoint tamper/replay/reconnect tests, concurrency, overload, revocation and lifecycle regressions. The replacement-stream regression fails without the guard and passes with it. This integration has types/lint/format and focused checks; historical screenshots keep their original source revisions.

Trusted client: compare Host fingerprint → generate device key
        ↓ Noise XK handshake; no bearer in the outer request
Host Devices / device-approve-key: approve the exact device key
        ↓ encrypted admission binds device key + existing credential
Connect channel: authenticated counters, bounded fragments, credit ACKs
        ├─ HTTP RPC, private input, uploads and protected resources
        └─ logical live streams, approvals and push registration
Host Device Gateway → existing owning modules and native credential store
- Ordinary bearer/API traffic at the Connect origin
+ Only /botharness-device/channel; Noise_XK_25519_ChaChaPoly_SHA256
+ Persistent Host identity, pinned trust record, exact-key approval
+ Native private-input form with masked fields and immediate value clearing
+ Shared encrypted browser/mobile carrier and encrypted resource reads
+ Reject untrusted enrollment and saved routes before RPC, streams or resource reads
+ Stop notification approvals on Connect failures; never retry another route
+ Carry notification settings through the encrypted gateway root path
+ Fail closed on key changes, malformed traffic and revocation
+ Replace the long fingerprint alert with focused native verification and approval steps
+ Keep all fingerprint groups; optional explanations and cancellable confirmation
+ Establish one shared Web, desktop and native UI design standard: layout, icons and interaction first
+ Use iOS modal pairing and an immediate first-use notice dismissal; no cold restart
+ Align 11 Expo SDK 58 patches and their lockfile; keep exact release-age exceptions
  Full phone WebView and Connect Browser/Computer viewers remain unavailable

Shared UI design standard (中文) now governs every new or changed Web, desktop and native interface. Repository instructions, mobile design, UI copy and the DSH UI skill reference one authority. Layout, icons and interaction carry the task; essential labels, accessibility and informed security decisions remain explicit. This follow-up changes documentation only; native evidence below retains its actual source revision.

Native fingerprint verification — existing QA iOS27, 402 × 874, English. The original alert becomes one focused step inside the pairing modal. Complete selectable fingerprints, native actions and optional explanation retain both trust checks. No native rebuild.

Before → after (light/default text):

Before: long fingerprint alert over scan form

After: concise computer verification

After: dark computer verification

After: approve the phone on the computer

Maximum system text: full fingerprint and reachable confirmation

Exact-source report and six-case receipt: light/dark × three text sizes passed full Host/device fingerprint comparison and immediate Settings/Activity/Chats use in the same process. Details, mismatch, Back and pending-approval Cancel passed; no pre-confirmation channel or fallback. Capture snapshot: 822 outer entries / 18 upgrades, fixed channel path, no credential headers, zero fallback. The existing Maestro same-process interaction flow also passed. Focused tests: 39 passed; mobile typecheck, lint, format and changelog checks passed. Android/physical devices/assistive technology and Chinese native rendering remain unverified; deployed account enrollment was not run at that historical source; the final Batch53 result below supersedes that gap. The password failure matrix below is prior evidence, separate from this presentation change. Temporary tunnel/DNS, task keys and own services were cleaned up; other pairings, Simulator and native build preserved.

Remote Web private input, before and after (synthetic account):

Theme Track A Track B
Light
Dark

Mobile private-input form and cleared success state — Expo Web, not native QA:

Capture provenance and verification boundaries.

Real Cloudflare password verification — runtime source 683b0cbe, evidence-only commit 606b1b75e7cb. Normal public DNS/TLS; 1,466 outer entries / 39 upgrades, no synthetic password or credential headers, zero fallback-trap requests.

Trusted Web: before / rejected tunnel / explicit retry succeeded

cf-web-before

cf-web-fail

cf-web-ok

Existing QA iOS27: masked real keyboard / failure / Handled with input removed

cf-ios-input

cf-ios-fail

cf-ios-ok

Verification method, native limitation and scope. Temporary tunnel/DNS, test device keys, synthetic credential and task services were cleaned up; existing devices and store app were preserved.

Native first pairing — existing QA iOS27, 402 × 874. Before: detent-controller error blocked interaction. After: new key approved, Chats/Settings/Activity usable in the same process. Android presentation is unchanged.

Before: first pairing native sheet error

After: Chats immediately usable, light

After: Chats immediately usable, dark

After: maximum system text

Native diagnosis, six-case receipt and cleanup. Includes Back, Close, downward swipe and opening the QA conversation. The first-use notice no longer fades on iOS, preventing overlap with immediate pairing; other sheets retain their default animation.

Main Simulator batch52 — real tunnel, partial acceptance

Actual main 55e0ce95200f, existing QA iOS27 + qualified installed client; no cold restart after first pairing. Full fingerprint/key approval, real DM, native masked password, HTTP502 refusal → explicit recovery/clearing, malformed-handshake refusal and revoked-device refusal passed. Outer pre-decryption capture: 3,240 records /82 channel upgrades, synthetic secret/application markers absent, fallback trap0; one deliberate plaintext QA probe404 was separate.

At this baseline native image sending failed before upload (Blob.arrayBuffer unavailable). The later matched Batch53 recheck below verified repair #2578, now merged. This historical baseline is not deployed account-enrollment, physical/Android, complete accessibility or independent security acceptance.

Exact-source report and limits.

First pairing: independently compare full Host fingerprint

First pairing: independently compare full Host fingerprint

Approve the exact phone key

Approve the exact phone key

Native password stays masked

Native password stays masked

Tunnel failure refuses submission

Tunnel failure refuses submission

Explicit recovery succeeds and removes the input

Explicit recovery succeeds and removes the input

Malformed handshake refuses submission

Malformed handshake refuses submission

Revoked device refuses submission

Revoked device refuses submission

Preserved original native image failure; follow-up #2578

Preserved original native image failure; follow-up #2578

Batch53 — native tracer completed with upload repair

Matched main 46bb44b2ff4f reproduced native image failure; #2578 ea36821ea929 fixes it on the same existing QA iOS27/client. Actual native DM, PNG upload, private input and real tool approval passed, with owning Host evidence and zero plaintext fallback. HTTP502, malformed-handshake and revoked-device submissions remained pending/refused. Full CI39739723972 passed. Exact-source report and qualification limits. Formal account enrollment subsequently passed as recorded below; #2578 is merged and #2542 acceptance is complete.

Repaired native image and real DM reply

Actual one-time tool approval completed

Formal account enrollment on deployed Connect also passed after the Human-authorized relay update (version ebedbe4d-8b7c-42ce-bb68-5d8dcb630fa7). The full Host fingerprint matched an independent authenticated Host read; only the exact displayed phone key was approved. Native Settings immediately loaded over the managed Cloudflare tunnel and the Host reported encrypted, with unchanged App PID4008. The former relay version rejected the current Host before trust; no plaintext pairing fallback was accepted. Account acceptance and coverage limits.

Formal account pairing: independently verify full computer fingerprint

Formal account pairing: approve the exact phone fingerprint

Same app process immediately connected through deployed Connect

Only the task phone key and temporary account Host/tunnel/DNS were removed after verification; original My Mac and devices were preserved. #2578 was merged as 4de4982443d501af9b68372848bc7fec36f7d7c4 after explicit Human approval; #2542 acceptance is complete. Android, physical-device, CJK, VoiceOver and independent security qualification remain separately unrun.

Issue: #2542

Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Issue: #2542

Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Issue: #2542

Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 115 files, which is 15 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Check out review usage here.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 7f102f8d-0017-43f8-887c-376408ef8074
📥 Commits

Reviewing files that changed from the base of the PR and between f267b70 and c1b1eec.

⛔ Files ignored due to path filters: 31
  • .github/pr-screenshots/2542/cf-ios-fail.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/cf-ios-input.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/cf-ios-ok.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/cf-ios-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/cf-web-before.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/cf-web-fail.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/cf-web-ok.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-actions.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-before.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-max.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-mid-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-mid.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/fp-phone.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/mobile-web-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/mobile-web-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/mobile-web-saved.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-activity.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-before.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-chat.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/pair-max.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/private-after-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/private-after-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/private-before-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2542/private-before-light.png is excluded by !**/*.png
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing: 115
  • .agents/skills/dsh-ui/SKILL.md
  • .agents/skills/verify-deepseekbot/features/README.md
  • .agents/skills/verify-deepseekbot/features/connect-channel.md
  • .agents/skills/verify-deepseekbot/features/phone-pairing.md
  • .agents/skills/verify-deepseekbot/features/remote-hosts.md
  • .github/pr-screenshots/2542/README.md
  • .github/pr-screenshots/2542/fingerprint-results.json
  • .github/pr-screenshots/2542/fingerprint-ui.md
  • .github/pr-screenshots/2542/integration-security.md
  • .github/pr-screenshots/2542/native-pairing-results.json
  • .github/pr-screenshots/2542/native-pairing.md
  • .github/pr-screenshots/2542/real-ios-result.json
  • .github/pr-screenshots/2542/real-outer-result.json
  • .github/pr-screenshots/2542/real-revocation-result.json
  • .github/pr-screenshots/2542/real-tunnel-result.json
  • .github/pr-screenshots/2542/real-tunnel.md
  • .github/pr-screenshots/2542/real-web-result.json
  • AGENTS.md
  • apps/mobile/.maestro/sim/README.md
  • apps/mobile/.maestro/sim/pairing-return.yaml
  • apps/mobile/AGENTS.md
  • apps/mobile/DESIGN.md
  • apps/mobile/app/_layout.tsx
  • apps/mobile/app/inbox/[id].tsx
  • apps/mobile/app/pair/account.tsx
  • apps/mobile/app/pair/tailscale.tsx
  • apps/mobile/app/private-input.tsx
  • apps/mobile/src/host/carrier.ts
  • apps/mobile/src/host/client.ts
  • apps/mobile/src/host/connect-account.ts
  • apps/mobile/src/host/encrypted-carrier.ts
  • apps/mobile/src/host/host-session.ts
  • apps/mobile/src/host/hosts.ts
  • apps/mobile/src/host/native-carrier.ts
  • apps/mobile/src/host/native-memory-preview.ts
  • apps/mobile/src/host/pairing.ts
  • apps/mobile/src/host/private-input.ts
  • apps/mobile/src/host/push-actions.ts
  • apps/mobile/src/host/push-routing.ts
  • apps/mobile/src/host/push.ts
  • apps/mobile/src/host/saved-host.web.ts
  • apps/mobile/src/host/share-attachment.ts
  • apps/mobile/src/telemetry/schema.ts
  • apps/mobile/src/ui/chat/conversation-screen.tsx
  • apps/mobile/src/ui/chat/image-viewer.tsx
  • apps/mobile/src/ui/chat/message-attachments.tsx
  • apps/mobile/src/ui/chat/private-input-card.tsx
  • apps/mobile/src/ui/chat/sheet.tsx
  • apps/mobile/src/ui/primitives/app-dialog.ts
  • apps/mobile/src/ui/primitives/pairing-actions.ios.tsx
  • apps/mobile/src/ui/primitives/pairing-actions.tsx
  • apps/mobile/src/ui/primitives/resource-image.tsx
  • apps/mobile/src/ui/private-input-form.tsx
  • apps/mobile/src/ui/shell/host-drawer.tsx
  • apps/mobile/src/ui/shell/pairing-verification.tsx
  • apps/mobile/src/ui/shell/statistics-notice-view.tsx
  • apps/mobile/src/ui/shell/use-pairing.ts
  • apps/mobile/src/ui/strings.ts
  • apps/mobile/test/app-dialog.test.tsx
  • apps/mobile/test/attention-actions.test.ts
  • apps/mobile/test/connect-account.test.ts
  • apps/mobile/test/encrypted-carrier.test.ts
  • apps/mobile/test/inbox-observer.test.ts
  • apps/mobile/test/pairing-verification.test.tsx
  • changes/2542-connect-noise-xk.md
  • changes/2542-ui-design-standard.md
  • docs/adr/0241-hosted-connect-reaches-the-host-through-a-managed-tunnel.md
  • docs/adr/0242-a-browser-pairs-other-computers-through-their-device-gateway.md
  • docs/adr/0244-connect-encrypts-device-traffic-against-pinned-host-keys.md
  • docs/agents/ui-copy.md
  • docs/agents/ui-design.md
  • docs/agents/ui-design.zh.md
  • docs/architecture/botharness-architecture.md
  • docs/architecture/connect-channel-v1.md
  • docs/bot-cli.md
  • docs/bot-cli.zh.md
  • packages/client/src/client/host-tabs.tsx
  • packages/client/src/client/locale.ts
  • packages/client/src/client/message-host.ts
  • packages/client/src/client/paired-devices.tsx
  • packages/client/src/client/private-input-card.tsx
  • packages/client/src/client/remote-hosts.ts
  • packages/client/test/channel-user-question.test.ts
  • packages/client/test/model-preset-profile.test.ts
  • packages/client/test/remote-conversation-source.test.tsx
  • packages/client/test/remote-message.test.ts
  • packages/connect-relay/src/relay.ts
  • packages/connect-relay/test/connect-relay.test.ts
  • packages/core/package.json
  • packages/core/src/bots/cli-devices.ts
  • packages/core/src/devices/connect.ts
  • packages/core/src/devices/encrypted-gateway.ts
  • packages/core/src/devices/http.ts
  • packages/core/src/devices/mount.ts
  • packages/core/src/devices/noise-identity.ts
  • packages/core/src/devices/noise/channel.ts
  • packages/core/src/devices/noise/xk.ts
  • packages/core/src/devices/pairing.ts
  • packages/core/test/cli-connect.test.ts
  • packages/core/test/cli-devices.test.ts
  • packages/core/test/connect-channel.test.ts
  • packages/core/test/connect-encrypted-gateway.test.ts
  • packages/core/test/connect-identity.test.ts
  • packages/core/test/connect-noise.test.ts
  • packages/core/test/connect-pairing.test.ts
  • packages/core/test/connect-secret-route.test.ts
  • packages/core/test/device-connect.test.ts
  • packages/core/test/device-gateway.test.ts
  • packages/core/test/device-pairing.test.ts
  • packages/core/test/fixtures/noise/README.md
  • packages/core/test/fixtures/noise/xk-cacophony.json
  • packages/core/test/onboarding.test.ts
  • pnpm-workspace.yaml
  • scripts/cli-ui-inventory.json
  • scripts/verification-inventory.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@DoodleBears DoodleBears added the ci:full Run the complete verification test plan for this pull request label Oct 21, 2026
Issue: #2542

Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
@DoodleBears

DoodleBears commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor Author

Native pairing fixed — head cb65e43

Native diagnosis, screenshots, six-case receipt and cleanup.

  • iOS uses the existing modal presentation for the nested pairing stack; the first-use notice closes without a fade that can overlap the next presentation. Android and encryption/admission/fallback code are unchanged.
  • Reused existing QA iOS27 and qualified Debug binary. Six light/dark × system-text cases, Maestro interaction regression, Back/Close/swipe and opening the QA conversation passed. Application PID remained the same after approval and subsequent use: no cold restart or overlay dismissal to recover.
  • Six focused files / 23 tests, mobile typecheck, lint, format and changelog checks passed. Full CI passed for this exact head, including all three full shards, static/build, mobile verification, Android native modules, docs and Host smoke.
  • Earlier real Cloudflare password failure/retry evidence remains valid at its recorded source. This follow-up's pairing/navigation capture contains 2,385 entries / 46 upgrades, no credential headers and zero fallback requests; it is not a new password submission run.
  • Own tunnel/DNS, test keys and services cleaned up; shared lane released. Existing devices, store app, other pairing and build products preserved. Physical iPhone, Android, deployed account enrollment, Human QA and external cryptographic audit remain separate.

PR remains Draft and stacked above #2546. No merge or release. The local HTML explainer is regenerated for this head; local-file browser policy still prevents a fresh visual inspection. The GitHub report and rendered native screenshots are reviewer-accessible.

Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Reject untrusted enrollment and persisted carrier routes, including cached resources. Stop notification approvals after Connect failures and carry push settings through the encrypted gateway.

Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Refs #2542

Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141

Claim: #2542 (comment)
Use the existing iOS modal presentation for the nested pairing stack so
late content layout does not touch a dismissed form-sheet controller.
Remove the first-use notice's iOS fade to avoid blocking touches when a
pairing link opens immediately after it closes. Android stays unchanged.

Reused QA iOS 27: six theme/text cases, same process before approval and
after Settings/Activity use, plus the Maestro regression, Back/Close/swipe
and QA chat. Includes red/green evidence and a bounded cleanup receipt.

Refs #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Agent-Claim: #2542 (comment)
Show one pairing step at a time with complete selectable fingerprints,
native actions and optional explanations. Settle cancelled confirmations
without granting trust and preserve exact device-key approval.

Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Route canonical message resources through encrypted reads and keep private-input capability gating. Scope delayed request/stream cleanup to each concrete owner; add receiving-endpoint tamper, replay, reconnect, substitution, concurrency, overload and lifecycle regressions.

Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
@DoodleBears
DoodleBears marked this pull request as ready for review October 22, 2026 06:16
@DoodleBears
DoodleBears changed the base branch from codex/2541-connect-secret-safety to main October 22, 2026 06:21
Keep strict route admission intact; the main-branch positive-path fixtures now use Tailscale HTTPS names rather than unsupported example domains. All 68 affected tests pass.

Issue: #2542
Agent-Task: codex/local/01a15fc3-2dc9-7e13-a9c5-8ca7f162d141
@DoodleBears
DoodleBears merged commit ebab8f9 into main Oct 22, 2026
13 checks passed
@DoodleBears
DoodleBears deleted the codex/2542-connect-noise-xk branch October 28, 2026 04:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:full Run the complete verification test plan for this pull request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant