Skip to content

Fix silent account-machine connect: zombie relay detection + sealed adoption fallback#884

Merged
arul28 merged 11 commits into
mainfrom
ade/ok-start-skill-find-issue-0f1fb479
Jul 23, 2026
Merged

Fix silent account-machine connect: zombie relay detection + sealed adoption fallback#884
arul28 merged 11 commits into
mainfrom
ade/ok-start-skill-find-issue-0f1fb479

Conversation

@arul28

@arul28 arul28 commented Jul 23, 2026

Copy link
Copy Markdown
Owner

Why

Account-machine Connect (the PIN-less "adopt a machine from your account" flow) fails silently across the fleet. Diagnosed live against a real MacBook Pro → Mac Studio pair: the row spins "Connecting" for ~1s, returns to "Connect", no error message, ever — while pairing by six-digit PIN works every time. Reverse direction worked, which is what made it look flaky.

Root causes, confirmed against the relay Worker's own Cloudflare logs and the host brain state:

  1. Zombie relay control (primary, unfixed anywhere). A machine's long-lived relay control WebSocket can die at the Cloudflare Durable Object with no close frame reaching the host. The host's only liveness check was a native WS ping — which the CF edge answers itself for hibernatable sockets without consulting the DO. So the host believed its relay was healthy for 3.5+ hours while every /connect/<machineKey> was rejected host_offline. The Studio sat in this state through ~30 silent user retries.
  2. Dishonest publication. "Relay bridge validated" came from a loopback-only probe that never touched the relay, so the directory kept advertising a relay route that couldn't deliver.
  3. Adoption was relay-only. Even same-Wi-Fi adoption dialed only the relay (desktop and iOS), so a wedged relay tunnel meant no fallback.
  4. The UI swallowed every error. AccountMachineRow computed the failure and dropped it on the floor (only SavedMachineRow rendered errors).

What

  • Zombie detection — an application-level JSON {t:"ping"}{t:"pong"} keepalive on the control socket (the DO must answer, unlike edge-terminated native pings). Miss → terminate + reconnect within minutes.
  • End-to-end self-probe — the host dials its own /connect/<machineKey> like a real client after every control open and bridge validation; the relay endpoint is published to the account directory only after that round-trips. ade sync status / ade doctor now report the honest verdict. A 4503 at-capacity close is treated as liveness, not a false zombie.
  • ade-adopt-v1 sealed adoption — machines publish an ed25519 identity key in their directory row; the host signs the adopting client's challenge over an ephemeral X25519 exchange, and the account bearer / DPoP / minted secret travel ChaCha20-Poly1305-sealed. Clients verify host identity before releasing any credential and fail closed (no downgrade to plaintext-on-LAN). This lets adoption fall back relay → Tailscale → LAN on desktop, ade code remote, and iOS. Cross-platform crypto is locked by a golden test vector (TS ↔ Swift, independently reverified).
  • Surfaced failures — the account row now shows the real error, live route-stage text while connecting, a "Connected via Tailscale · 12ms" toast, and a one-tap Pair nearby instead jump into the PIN flow when the machine is discoverable locally. iOS gets parity.

Security

Three independent reviewers (Fable, Opus, codex) audited the protocol and converged: sound on replay, downgrade/MITM, nonce uniqueness, key parsing, and the transport-gate change (every account-auth check preserved). Two rounds of review-driven hardening are included: the adopt-challenge issuance limiter no longer lets a few cheap frames lock out adoption host-wide (well-formed challenges feed no cross-tenant limiter; over relay every adopter shares the loopback origin), and the self-probe no longer over-claims health at the tunnel cap.

One item deliberately deferred to a follow-up (not this PR): pubkey continuity pinning (TOFU) — a directory that drops a previously-published key silently reverts clients to legacy plaintext-over-relay. Present-but-malformed keys already fail closed; only absence downgrades, over the already-trusted relay. Pinning interacts with the machine-trust-reset migration and key rotation, so it wants its own review.

Validation

  • Typecheck: apps/ade-cli, apps/desktop, apps/account-directory — clean.
  • Tests: ade-cli sync+account 532, desktop remoteTargets/adoption/bridge/preload 132 + shared 42, account-directory 31, iOS PairingAndDpopTests 19 (full build+test passed), tuiClient 929 — all green.
  • Regression tests added for each review finding: challenge-decline failover, 4503 at-capacity classification, DoS limiter policy (well-formed never throttled, malformed floods still are), present-but-blank pubkey fail-closed, direct-route impostor abort.
  • Parity: docs (sync/architecture/CLI), iOS compatibility contract (new phone ↔ old brain without pubkey → legacy relay, verified), CLI (ade doctor relay check), TUI (inherits fallback) — all reconciled.
  • Logging gate: new zombie/self-probe lines are operational jsonl only (never forwarded to PostHog, matching the storage-doctor pattern); no PostHog/PII/keys added.

Rollout note

apps/account-directory (the pubkey column is already in its schema) and the tunnel relay need no new deploy for this to function; the directory pubkey publish + sealed adoption activate as machines update. Ship alongside the next desktop release + TestFlight build.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added secure machine adoption with verified identities and encrypted authentication.
    • Added Relay end-to-end self-probes, latency reporting, and clearer readiness diagnostics.
    • Added machine-pairing progress updates across desktop and mobile interfaces.
    • Added account-specific success and error messaging, including “Pair with PIN instead” fallback.
    • Added connection success toast notifications and improved pairing guidance.
  • Bug Fixes
    • Relay routes are now published only after successful end-to-end verification.
    • Invalid or oversized machine identity keys are rejected safely.
  • Documentation
    • Updated account and machine identity setup guidance.

ADE   Open in ADE  ·  ade/ok-start-skill-find-issue-0f1fb479 branch  ·  PR #884

Greptile Summary

The PR hardens account-machine connection and adoption flows.

  • Adds application-level Relay liveness checks and end-to-end self-probing before route publication.
  • Adds identity-verified, encrypted account adoption with Relay, Tailscale, and LAN fallback across desktop, CLI, and iOS.
  • Publishes bounded machine identity keys through the account directory.
  • Surfaces route progress, failures, successful connection details, and PIN-pairing fallback in desktop and iOS interfaces.

Confidence Score: 5/5

The PR appears safe to merge because no blocking failure remains.

No blocking failure remains.

T-Rex T-Rex Logs

What T-Rex did

  • T-Rex started the real desktop Vite renderer, completed its browser-mock predev hook, and reported VITE v8.0.3 ready.
  • Playwright then attempted to load the repository renderer, but the browser emitted repeated connection failures after the Vite process was terminated.
  • The kernel log showed an oom-kill and an Out of memory message indicating the killed process.
  • Only one screenshot was produced and it was blank, so the UI proof was rejected.
  • Consequently, the claimed surfaced failure and related UI indicators remain inconclusive rather than a confirmed failure.

T-Rex Ran code and verified through T-Rex

Important Files Changed

Filename Overview
apps/ade-cli/src/services/sync/syncHostService.ts Adds the host side of signed, sealed account adoption and challenge-abuse controls while preserving existing authentication gates.
apps/ade-cli/src/services/sync/syncTunnelClientService.ts Adds Relay control-socket application keepalives and lifecycle handling for zombie registration recovery.
apps/ade-cli/src/services/sync/syncRelaySelfProbe.ts Implements end-to-end Relay self-probing and classifies tunnel-capacity responses as proof of liveness.
apps/ade-cli/src/services/account/accountMachinePublisherService.ts Publishes the machine identity key and exposes Relay routes only after end-to-end verification.
apps/desktop/src/main/services/remoteRuntime/syncPairedMachineStore.ts Adds identity-verified sealed account adoption with ordered Relay, Tailscale, and LAN failover.
apps/desktop/src/shared/sync/adoptChannelCrypto.ts Defines the shared Ed25519, X25519, HKDF, and ChaCha20-Poly1305 protocol primitives.
apps/ios/ADE/Services/SyncService.swift Implements the corresponding sealed adoption protocol and route fallback for iOS.
apps/desktop/src/renderer/components/remoteTargets/RemoteTargetList.tsx Adds connection-stage feedback, surfaced errors, success details, and nearby PIN-pairing fallback.
apps/account-directory/src/directory.ts Accepts bounded opaque machine public-key metadata during registration.

Sequence Diagram

sequenceDiagram
  participant Client as Desktop / CLI / iOS
  participant Directory as Account Directory
  participant Relay as ADE Relay
  participant Host as Machine Brain

  Host->>Relay: Open control connection
  Host->>Relay: Self-dial machine route
  Relay->>Host: End-to-end probe
  Host->>Directory: Publish verified routes and Ed25519 public key

  Client->>Directory: List account machines
  Directory-->>Client: Routes and host public key
  loop Relay, Tailscale, then LAN
    Client->>Host: Account adoption challenge
    Host-->>Client: Signed ephemeral key exchange
    Client->>Client: Verify host identity
    Client->>Host: Sealed account authentication
    Host-->>Client: Sealed paired credential
  end
Loading

Reviews (2): Last reviewed commit: "fix(ios): avoid Int64(Double) trap on ma..." | Re-trigger Greptile

arul28 and others added 9 commits July 22, 2026 23:47
…o-end probes

JSON control keepalive (DO-answered, unlike edge-terminated native pings),
relay self-probe of our own /connect/<machineKey> after control open and
every bridge validation, honest relay endpoint publication (drop stale
retention on verified failure), truthful sync status + doctor verdicts,
and zombie telemetry logs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…routes

AccountMachineRow now renders adoption errors (previously computed and
silently dropped), a guided "Pair nearby instead" jump into the existing
PIN flow, live stage text over the new account:pairMachineProgress IPC
channel, and a transient connected-via route/latency line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Machines publish an ed25519 identity key in their directory row and answer
a pre-auth account_challenge by signing the client nonce over an ephemeral
X25519 exchange. Adoption hellos and hello_ok replies are then sealed with
the derived session key, so account adoption can safely run over any route
and clients verify the host is genuine before releasing credentials.
Plaintext account hellos remain relay-only for legacy compatibility.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adoption tries the directory-verified relay first and, for hosts that
publish an identity key, falls back to sealed adoption over tailnet and
LAN routes. Host-identity verification failures abort immediately without
dialing further routes; route-by-route stage progress feeds the desktop
Connections panel and failures aggregate every attempted route.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…PIN fallback

iOS mirrors ade-adopt-v1 (X25519+HKDF+ChaChaPoly with Ed25519 host identity
verified against the directory pubkey, fail-closed on malformed keys), tries
relay → Tailscale → LAN for adoption, and gains stage text, a guided
pair-with-PIN fallback, connected-route toast, and accessibility support.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… relay publication

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… downgrade edges

- Adopt-challenge issuance: only malformed/anomalous challenges feed the
  cross-tenant global rate limiter; well-formed signing requests count per-IP
  only, so a few cheap frames (or one failed multi-route adoption) can no
  longer lock out account adoption host-wide.
- Relay self-probe: a CLOSE_TOO_MANY (at tunnel cap) rejection is proof the
  control socket is alive and serving clients — treat it as liveness, not a
  zombie verdict that would terminate control and drop the relay endpoint.
- Directory pubkey: preserve a present-but-blank key so it fails closed at
  verification like iOS, instead of silently downgrading to plaintext relay.
- Host challenge decline (cooldown) now surfaces the host's real reason and
  fails over to the next route instead of a misleading identity-abort.
- Publisher uses the shared signing-key filename constant; drop dead keepalive
  sleep/wake branch; iOS connectedLabel reuses attemptLabel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… re-review

Re-review showed the per-IP challenge limiter is degenerate over relay (every
relay adopter reaches the host from 127.0.0.1 via the loopback bridge), so a
few well-formed relay adoptions could still trip a shared cooldown. Well-formed
challenges now feed no limiter at all — signing load is bounded by the
per-connection single-active guard and the relay's connection cap — and only
malformed/anomalous challenges (genuine abuse) count.

Also: a self-probe CLOSE_TOO_MANY (4503) is inconclusive, not proof of health
(an attacker could fill all 16 slots to mask a stale control), so it now
renders no verdict — the JSON control keepalive independently owns zombie
detection regardless of tunnel capacity, and prior publication state is left
untouched.

Tests updated to assert well-formed challenges are never throttled while
malformed floods still are, and the 4503 atCapacity classification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Document the ade-adopt-v1 sealed handshake and envelope types, the JSON
control keepalive + end-to-end self-probe with honest relay publication
(pubkey + relayEndToEnd gating, 4503 at-capacity liveness), and the
ade doctor relay self-probe verdict.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
ade Ignored Ignored Preview Jul 23, 2026 6:07am

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

Account identity and adoption

Layer / File(s) Summary
Directory identity metadata
apps/account-directory/..., apps/ade-cli/...
Machine registrations now carry bounded Ed25519 public keys, persisted through a restrictive signing-key store and gated relay publication state.
Adoption protocol
apps/ade-cli/src/services/sync/..., apps/desktop/src/shared/sync/...
Hosts and clients exchange signed challenges and sealed account credentials using X25519, HKDF, ChaCha20-Poly1305, and Ed25519 verification.
Relay self-probe
apps/ade-cli/src/services/sync/..., apps/ade-cli/src/cli.ts
Relay readiness now includes accepted/ready self-probes, JSON keepalive checks, latency, failure state, RPC access, and doctor output.
Desktop and iOS pairing
apps/desktop/..., apps/ios/...
Pairing uses ordered relay, tailnet, and LAN routes with progress reporting, structured failures, sealed responses, success feedback, and PIN fallback flows.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

  • arul28/ADE#827: Related account-machine publishing and Ed25519 directory registration changes.
  • arul28/ADE#846: Related relay health status plumbing and readiness reporting.

Suggested labels: desktop, ios, docs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately reflects the main changes: zombie relay detection and sealed adoption fallback for account-machine connections.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ade/ok-start-skill-find-issue-0f1fb479

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.

…rogress to webclient account surface

- .gitleaksignore: the ade-adopt-v1 HKDF session-key vector (derived from public
  RFC 7748 keys, asserted in code) trips generic-api-key in a doc comment.
- webclient adapter completeness test: include the onPairMachineProgress method
  added to the browser account namespace.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@arul28

arul28 commented Jul 23, 2026

Copy link
Copy Markdown
Owner Author

@codex review — pushed two CI fixes: gitleaks allowlist for the ade-adopt-v1 RFC-7748-derived test vector, and the webclient account-surface completeness list. No product-code changes since your last pass.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. You're on a roll.

Reviewed commit: 7e6d119f7b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/ios/ADE/Services/SyncService.swift`:
- Around line 4826-4832: Update the timestamp validation preceding
Int64(timestampValue) to use a strictly safe upper bound that guarantees
conversion cannot exceed Int64.max, while preserving the existing finite,
integral, and nonnegative checks. Keep the machineName error path unchanged and
ensure malformed out-of-range values throw
AccountAdoptionIdentityVerificationError instead of trapping.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 0312fdda-0aa3-48ff-b606-f237deffd1e0

📥 Commits

Reviewing files that changed from the base of the PR and between 78556e6 and d911d83.

⛔ Files ignored due to path filters (4)
  • CHANGELOG.md is excluded by !*.md
  • docs/ARCHITECTURE.md is excluded by !docs/**
  • docs/features/remote-runtime/README.md is excluded by !docs/**
  • docs/features/sync-and-multi-device/README.md is excluded by !docs/**
📒 Files selected for processing (53)
  • apps/account-directory/README.md
  • apps/account-directory/src/directory.ts
  • apps/account-directory/test/directory.test.ts
  • apps/ade-cli/README.md
  • apps/ade-cli/src/adeRpcServer.ts
  • apps/ade-cli/src/cli.test.ts
  • apps/ade-cli/src/cli.ts
  • apps/ade-cli/src/multiProjectRpcServer.ts
  • apps/ade-cli/src/services/account/accountMachineDirectoryService.test.ts
  • apps/ade-cli/src/services/account/accountMachineDirectoryService.ts
  • apps/ade-cli/src/services/account/accountMachinePublisherService.test.ts
  • apps/ade-cli/src/services/account/accountMachinePublisherService.ts
  • apps/ade-cli/src/services/sync/machineIdentitySigningStore.test.ts
  • apps/ade-cli/src/services/sync/machineIdentitySigningStore.ts
  • apps/ade-cli/src/services/sync/syncHostService.test.ts
  • apps/ade-cli/src/services/sync/syncHostService.ts
  • apps/ade-cli/src/services/sync/syncLoopbackCollision.test.ts
  • apps/ade-cli/src/services/sync/syncRelaySelfProbe.test.ts
  • apps/ade-cli/src/services/sync/syncRelaySelfProbe.ts
  • apps/ade-cli/src/services/sync/syncService.ts
  • apps/ade-cli/src/services/sync/syncTunnelClientService.test.ts
  • apps/ade-cli/src/services/sync/syncTunnelClientService.ts
  • apps/desktop/src/main/services/account/accountBridge.trust.test.ts
  • apps/desktop/src/main/services/account/accountBridge.ts
  • apps/desktop/src/main/services/ipc/registerIpc.ts
  • apps/desktop/src/main/services/remoteRuntime/syncPairedMachineStore.test.ts
  • apps/desktop/src/main/services/remoteRuntime/syncPairedMachineStore.ts
  • apps/desktop/src/preload/global.d.ts
  • apps/desktop/src/preload/preload.test.ts
  • apps/desktop/src/preload/preload.ts
  • apps/desktop/src/renderer/browserMock.ts
  • apps/desktop/src/renderer/components/remoteTargets/AccountMachineRow.tsx
  • apps/desktop/src/renderer/components/remoteTargets/PairMachineForm.tsx
  • apps/desktop/src/renderer/components/remoteTargets/RemoteTargetList.test.tsx
  • apps/desktop/src/renderer/components/remoteTargets/RemoteTargetList.tsx
  • apps/desktop/src/renderer/components/remoteTargets/SavedMachineRow.tsx
  • apps/desktop/src/renderer/components/remoteTargets/remoteTargetListStyles.ts
  • apps/desktop/src/renderer/webclient/adapter/account.ts
  • apps/desktop/src/shared/accountDirectory.test.ts
  • apps/desktop/src/shared/accountDirectory.ts
  • apps/desktop/src/shared/ipc.ts
  • apps/desktop/src/shared/sync/adoptChannelCrypto.test.ts
  • apps/desktop/src/shared/sync/adoptChannelCrypto.ts
  • apps/desktop/src/shared/types/account.ts
  • apps/desktop/src/shared/types/sync.ts
  • apps/ios/ADE/App/ContentView.swift
  • apps/ios/ADE/Services/AccountDirectory.swift
  • apps/ios/ADE/Services/SyncService.swift
  • apps/ios/ADE/Views/Account/MobileAccessGateView.swift
  • apps/ios/ADE/Views/Hub/HubQuickConnect.swift
  • apps/ios/ADE/Views/Settings/ConnectionSettingsView.swift
  • apps/ios/ADE/Views/Settings/SettingsConnectionHeader.swift
  • apps/ios/ADETests/PairingAndDpopTests.swift

Comment thread apps/ios/ADE/Services/SyncService.swift
…mestamp

Double(Int64.max) rounds up to 2^63, so a `<=` bound admitted a ts that traps
in Int64(...), crashing before skew validation on a malformed challenge. Use
strict `<`. (CodeRabbit)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@arul28

arul28 commented Jul 23, 2026

Copy link
Copy Markdown
Owner Author

Applied the strict-bound fix for the Int64(Double) timestamp trap (thanks @coderabbitai). @codex review — only change since last pass is that one-line iOS guard.

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- changed Swift hunks ---'
git diff --unified=20 HEAD^ HEAD -- 'apps/ios/**/*.swift'

echo '--- candidate timestamp conversion locations ---'
rg -n -C 8 'Int64\s*\(|Double\s*\(|timestamp|clock.?skew|challenge' apps/ios/ADE/Services/SyncService.swift

echo '--- source outline ---'
ast-grep outline apps/ios/ADE/Services/SyncService.swift --items all --type function --match 'Adopt|adopt|Account|account|Hello|hello'

Length of output: 30079


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- adoption challenge test references ---'
rg -n -C 10 'performAccountAdoptionChallenge|account_challenge|timestampMilliseconds|maximumClockSkew|Int64\.max|9223372036854775808' apps/ios/ADETests apps/ios/ADE

echo '--- test declarations near sealed-adoption coverage ---'
ast-grep outline apps/ios/ADETests/PairingAndDpopTests.swift --items all --type function --match 'test|Adopt|adopt|Sealed|sealed'

Length of output: 21777


@arul28 Reviewed the latest iOS-only change. The strict < Double(Int64.max) guard correctly rejects the rounded 2^63 value before Int64(...), while preserving the existing finite, integral, non-negative, and clock-skew checks. No findings on this update.

🐇 ✅


If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: b612042446

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@arul28
arul28 merged commit e0f2ffd into main Jul 23, 2026
35 checks passed
@arul28
arul28 deleted the ade/ok-start-skill-find-issue-0f1fb479 branch July 23, 2026 06:17
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.

1 participant