Skip to content

perf: route ChatGPT Codex upstream turns over responses_websockets - #1487

Draft
kargnas wants to merge 1 commit into
lidge-jun:devfrom
kargnas:pr/ws-upstream
Draft

perf: route ChatGPT Codex upstream turns over responses_websockets#1487
kargnas wants to merge 1 commit into
lidge-jun:devfrom
kargnas:pr/ws-upstream

Conversation

@kargnas

@kargnas kargnas commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Problem

Requests proxied through opencodex to the ChatGPT Codex backend consistently showed 2–3s worse TTFT than the same requests made by Codex CLI directly — even with the same account, same payload, and strictly sequential execution.

Root cause: Codex CLI talks to chatgpt.com/backend-api/codex/responses over the responses_websockets transport, while opencodex always POSTs SSE. The backend serves the WS path from a measurably faster queue.

Measurements (2026-08-12, same account, same payload, sequential, alternating order)

transport gpt-5.6-luna TTFT p50 mean
WS (responses_websockets) 1037 ms 1212 ms
SSE (POST, stream:true) 3897 ms 3686 ms

Event timeline shows the gap is upstream scheduling, not transfer: both paths reach response.created in ~0.5s, but SSE then waits 2.4–4.0s before response.output_item.added (WS: 0.8–1.3s).

Ruled out: HTTP/2 vs 1.1 (no change), OpenAI-Beta: responses_websockets header on the SSE POST (no change), session_id/prompt_cache_key (no change), warmup effects (no decay over sequential repeats), account differences (A/B with identical account).

A second finding: the fast lane keys on WS + originator tag, not the transport alone — 60KB turns run ~1.5s with originator: codex_cli_rs vs ~4.6s without. The patch defaults the header for callers that don't send one (Codex CLI always does).

Change

  • New src/server/responses/ws-upstream.ts: for streaming POSTs to the Codex backend, dial wss:// with the same headers, send the JSON body as a single response.create frame, and re-encode returned event frames as an SSE byte stream — so the passthrough relay, adapter parsers, and usage sniffing are all unchanged.
  • providerFetch() in fetch-helpers.ts wraps the provider fetch with this transport swap. Everything that isn't a Codex-backend streaming turn keeps the exact HTTP path.
  • Fallbacks: upgrade rejected (401/403/429/5xx) → retry over plain SSE so the real HTTP status reaches the existing refresh/rotation handlers; no 101 within 10s → SSE; frame-send failure → stream error into the caller's normal transport-retry path. WS-only frames (codex.rate_limits, responsesapi.websocket_timing) are dropped so clients see exactly the stream shape they always got.

After patching (local proxy vs direct Codex CLI)

target Luna TTFT p50 Terra TTFT p50
codex CLI direct (WS) 1196 ms 1426 ms
opencodex before 4385–4705 ms 2951–4431 ms
opencodex after 1424 ms 1577 ms

Also verified: tool-call round-trips (function_call arguments relay), 630KB / 900KB / 1.26MB / 1.5MB input frames, context_length_exceeded and server_is_overloaded error relay, and ~600 live requests through the patched proxy with no new failure modes.

Known trade-off

Bun's WebSocket does not expose the 101 response headers, so x-codex-*-reset-at quota hints are not visible on this path. The periodic quota poller still covers quota tracking. If there's a preferred way to surface those, happy to adjust.

Related: #1217 (stream-stage timing) would make this kind of transport gap visible in the dashboard.

Review readiness checklist

This PR stays in draft until every box below is ticked. Tick all four boxes once the requirements are met:

  • All CI tests are green on my local testing.

  • I pushed my PR to the latest dev commit.

  • I resolved all correct Codex and CodeRabbit findings.

  • My PR is ready for review.

Summary by CodeRabbit

  • New Features

    • Added WebSocket-based streaming for supported Codex responses.
    • Converts WebSocket events into the existing streamed response format.
    • Automatically falls back to HTTP streaming when WebSocket connections are unavailable or fail.
  • Reliability

    • Improved handling of timeouts, cancellations, aborted requests, send failures, and connection closures.
    • Filters unsupported protocol messages while preserving valid response events.
    • Maintains streaming continuity when WebSocket transport cannot be established.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Deterministic hygiene checks failed.

  • missing_regression_test — Behavior changed under src/ or gui/src/ without a test change. Add focused coverage or obtain test-exception-approved.

@github-actions github-actions Bot added intake: hygiene-blocked Deterministic PR hygiene checks failed enhancement New feature or request labels Aug 11, 2026
@github-actions github-actions Bot changed the title perf: route ChatGPT Codex upstream turns over responses_websockets [WRONG BRANCH] perf: route ChatGPT Codex upstream turns over responses_websockets Aug 11, 2026
@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • review readiness checklist open (3/4 boxes ticked).

What to do

  • Tick all four boxes in the PR description once you're done (currently 3/4).

Review readiness checklist

  • ✅ All CI tests are green on my local testing.
  • ✅ I pushed my PR to the latest dev commit.
  • ⬜ I resolved all correct Codex and CodeRabbit findings.
  • ✅ My PR is ready for review.

3/4 boxes ticked.

This PR stays in draft until every box above is ticked.

@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 18:17
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 03eafc0f-9b31-4747-ae18-905c90afd9da

📥 Commits

Reviewing files that changed from the base of the PR and between 1ad607a and ab6140a.

📒 Files selected for processing (2)
  • src/server/responses/ws-upstream.ts
  • tests/ws-upstream.test.ts

📝 Walkthrough

Walkthrough

The change adds a Codex WebSocket upstream for streamed responses. Eligible requests become WebSocket response.create frames and return SSE streams. Invalid requests, failed upgrades, timeouts, and connection errors use HTTP SSE fallback or stream errors.

Changes

Codex WebSocket transport

Layer / File(s) Summary
Request routing and selection
src/server/responses/ws-upstream.ts, src/server/responses/fetch-helpers.ts, tests/ws-upstream.test.ts
providerFetch routes eligible Codex streaming POST requests to codexWsUpstreamFetch. Other requests use the configured fetch implementation. Tests cover routing predicates and integration behavior.
Request frame and handshake
src/server/responses/ws-upstream.ts, tests/ws-upstream.test.ts
The wrapper parses the request body, removes the HTTP-only stream field, creates a response.create frame, normalizes handshake headers, and falls back to SSE for invalid bodies or failed upgrades. Tests cover serialization, fallback, headers, and pre-upgrade aborts.
Streaming and connection lifecycle
src/server/responses/ws-upstream.ts, tests/ws-upstream.test.ts
The implementation handles frame transmission, SSE conversion, unsupported-frame filtering, aborts, terminal events, errors, closure, and cancellation. Tests cover relaying, terminal-less closure, and mid-stream failure handling.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant providerFetch
  participant codexWsUpstreamFetch
  participant CodexWebSocket
  participant SSEStream
  Client->>providerFetch: send Codex streaming POST
  providerFetch->>codexWsUpstreamFetch: route eligible request
  codexWsUpstreamFetch->>CodexWebSocket: connect and send response.create
  CodexWebSocket-->>codexWsUpstreamFetch: emit response events
  codexWsUpstreamFetch->>SSEStream: convert events to SSE chunks
  SSEStream-->>Client: return streamed response
  CodexWebSocket-->>codexWsUpstreamFetch: reject upgrade or close connection
  codexWsUpstreamFetch->>Client: use HTTP SSE fallback or stream error
Loading

Possibly related PRs

  • lidge-jun/opencodex#1006: Both changes modify Responses transport selection and streaming behavior across WebSocket and HTTP SSE paths.
  • lidge-jun/opencodex#1095: Both changes modify the Responses WebSocket/SSE transport path, but this change adds upstream routing while #1095 repairs DeepSeek terminal events.

Suggested labels: review-ready

Suggested reviewers: ingwannu, lidge-jun, wibias

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the performance-focused change: routing ChatGPT Codex upstream turns through the WebSocket transport.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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: 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 `@src/server/responses/ws-upstream.ts`:
- Line 49: Update the frame construction in the response handling code so the
request body is spread before the fixed type field, ensuring body.type cannot
override the required "response.create" discriminator.
🪄 Autofix

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: ASSERTIVE

Plan: Pro Plus

Run ID: 62e4b534-49fe-49ec-9d15-41ce44708c43

📥 Commits

Reviewing files that changed from the base of the PR and between 6d881db and 2fae39e.

📒 Files selected for processing (2)
  • src/server/responses/fetch-helpers.ts
  • src/server/responses/ws-upstream.ts

Comment thread src/server/responses/ws-upstream.ts Outdated
@kargnas kargnas changed the title [WRONG BRANCH] perf: route ChatGPT Codex upstream turns over responses_websockets perf: route ChatGPT Codex upstream turns over responses_websockets Aug 11, 2026
@kargnas
kargnas changed the base branch from main to dev August 11, 2026 18:34
@github-actions github-actions Bot removed the intake: hygiene-blocked Deterministic PR hygiene checks failed label Aug 11, 2026
@kargnas

kargnas commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

Local full suite on this branch (rebased on dev @ 3b8f948): 11027 pass / 7 fail / 6 errors, all unrelated to this diff:

  • 6 errors are Cannot find module 'react' from gui/src/** — the worktree had no gui node_modules installed; environmental.
  • The remaining failure, codex-shim.test.ts > "Unix install rejects delayed detached redispatch after the launcher closes its lease fd", is flaky on my machine (passes 2 of 3 isolated re-runs, fails intermittently with the same 1.5s timing profile). This PR touches only src/server/responses/{fetch-helpers,ws-upstream}.ts + its own test file — no shim code.

tests/ws-upstream.test.ts itself: 6/6 pass.

@github-actions
github-actions Bot marked this pull request as ready for review August 11, 2026 18:50
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions[bot] Acknowledged. The pull request is marked ready for review.

You are interacting with an AI system.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The readiness gate is complete. I will review PR #1487.

⚠️ Action not completed

Already reviewed.

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.

@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: 4

🤖 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 `@src/server/responses/fetch-helpers.ts`:
- Around line 135-145: Add a focused regression test near the existing
fetch-helper tests that constructs providerFetch with a stubbed provider fetch,
verifies an eligible string URL routes through codexWsUpstreamFetch, and
verifies a non-eligible request uses the stubbed base fetch. Keep direct adapter
tests unchanged while covering the shared routing behavior introduced in
providerFetch.

In `@src/server/responses/ws-upstream.ts`:
- Line 4: Correct the date in the comment above the SSE queue implementation to
the actual measurement date, or remove the date entirely if it cannot be
verified.
- Around line 22-31: Update shouldUseCodexWsUpstream in
src/server/responses/ws-upstream.ts (lines 22-31) to parse the JSON body and
return true only when the top-level stream property is the boolean true;
preserve false for invalid JSON and nested stream values. Add regressions in
tests/ws-upstream.test.ts (lines 15-26) covering nested stream: true and
whitespace-formatted top-level streaming JSON.
- Around line 122-138: Update the ws.send(frameText) catch block in the upstream
response flow to resolve and return sseFallback(url, init) immediately when
sending fails. Preserve the existing controller error and websocket close
cleanup as needed, but do not construct the successful 200 Response after the
fallback is selected.
🪄 Autofix

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: ASSERTIVE

Plan: Pro Plus

Run ID: 078ecb9c-fd48-4728-b264-a5d90c3eb89a

📥 Commits

Reviewing files that changed from the base of the PR and between 3b8f948 and 1ad607a.

📒 Files selected for processing (3)
  • src/server/responses/fetch-helpers.ts
  • src/server/responses/ws-upstream.ts
  • tests/ws-upstream.test.ts

Comment on lines +135 to +145
const base = (provider as OcxProviderConfig & { fetch?: typeof globalThis.fetch }).fetch ?? globalThis.fetch;
// ChatGPT Codex backend: streaming turns ride the responses_websockets
// transport (measured ~3s faster TTFT than the SSE POST queue); everything
// else keeps the provider's HTTP fetch. See ws-upstream.ts for the details.
const wrapped = (input: Parameters<typeof globalThis.fetch>[0], init?: RequestInit) => {
if (typeof input === "string" && init && shouldUseCodexWsUpstream(input, init)) {
return codexWsUpstreamFetch(input, init, base);
}
return base(input, init);
};
return wrapped as typeof globalThis.fetch;

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a providerFetch routing regression test.

The existing suite calls codexWsUpstreamFetch directly. It does not verify the changed shared routing layer. Add a test that creates providerFetch with a stubbed provider fetch, then verifies that an eligible string URL uses the WebSocket adapter and a non-eligible request uses the stubbed base fetch.

As per path instructions, “A behavior change in src/ should come with a focused regression test near the existing tests for that subsystem.”

🤖 Prompt for 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.

In `@src/server/responses/fetch-helpers.ts` around lines 135 - 145, Add a focused
regression test near the existing fetch-helper tests that constructs
providerFetch with a stubbed provider fetch, verifies an eligible string URL
routes through codexWsUpstreamFetch, and verifies a non-eligible request uses
the stubbed base fetch. Keep direct adapter tests unchanged while covering the
shared routing behavior introduced in providerFetch.

Source: Path instructions

// Upstream WebSocket transport for the ChatGPT Codex backend.
//
// Why this exists: the Codex backend serves the responses_websockets path from
// a measurably faster queue than the plain SSE POST path. Measured 2026-08-12

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the future measurement date.

Line 4 states that the measurement occurred on August 12, 2026. That date is after August 11, 2026. Use the actual measurement date or remove the date.

🤖 Prompt for 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.

In `@src/server/responses/ws-upstream.ts` at line 4, Correct the date in the
comment above the SSE queue implementation to the actual measurement date, or
remove the date entirely if it cannot be verified.

Comment thread src/server/responses/ws-upstream.ts
Comment thread src/server/responses/ws-upstream.ts
@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 18:58

@Wibias Wibias left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The WebSocket direction is promising, but this head has several correctness blockers before it is safe to replace the canonical passthrough transport:

  1. Parse the root stream flag instead of substring-matching serialized JSON. body.includes("\"stream\":true") can route a non-streaming request to WS when a nested object contains stream: true, and it depends on one serialization spelling. Parse the top-level object and require stream === true, with nested/whitespace regressions.

  2. A synchronous ws.send() failure must fall back to SSE, not return a synthetic HTTP 200 with an errored body. At that point the response.create frame did not leave the client, so SSE fallback is safe and preserves the existing HTTP error/refresh/failover machinery. The current 200 response bypasses those pre-stream handlers.

  3. Do not turn a mid-stream WebSocket drop into clean EOF. The close handler calls controller.close() when no Responses terminal was observed. Downstream relaySseWithFailedTail() only synthesizes response.failed when its reader throws; on clean EOF it simply closes. So a WS reset after response.created can reach the client with no response.completed/response.failed terminal at all. Error the stream (or synthesize a failed terminal) when an opened socket closes before a terminal event, and add an integration regression through the passthrough relay rather than asserting that a terminal-less stream is acceptable.

  4. Do not fabricate originator: codex_cli_rs for callers that did not send it. The existing metadata-integrity contract explicitly verifies that pool/forward traffic does not invent originator and only preserves genuine caller metadata. This wrapper silently breaks that invariant after adapter construction and also means this PR is no longer just a transport swap: non-Codex/SDK traffic is represented upstream as Codex CLI traffic specifically to change backend scheduling. Preserve a real incoming originator, or make any synthetic provenance an explicit, separately reviewed policy rather than a transport default.

Please also add routing-level coverage for providerFetch() itself so the shared dispatch boundary is tested, not only codexWsUpstreamFetch() directly.

Current head is also 12 commits behind dev. The GitHub Actions runs on this head are action_required with no jobs, so there is no current cross-platform CI result to validate these transport changes yet. Please rebase and rerun the full maintained matrix after the fixes.

The ChatGPT Codex backend serves the responses_websockets (WS) path from
a measurably faster queue than the plain SSE POST path. Measured
2026-08-12 KST (same account, same payload, strictly sequential):
gpt-5.6-luna TTFT p50 ~1.0s over WS vs ~3.9s over SSE. Codex CLI itself
defaults to WS, so requests through opencodex carried an extra 2-3s of
TTFT that direct Codex CLI usage did not.

Wrap providerFetch() so that streaming POSTs to
chatgpt.com/backend-api/codex/responses dial wss:// instead: the JSON
body goes out as a single response.create frame and returned event
frames are re-encoded as an SSE byte stream, leaving every downstream
consumer (passthrough relay, adapter parsers, usage sniffing) unchanged.

Transport selection parses the body and requires a root-level
stream === true, so nested {"metadata":{"stream":true}} or formatted
JSON cannot misroute. Failure handling: upgrade rejection, a missing
101 within 10s, and a synchronous frame-send failure all fall back to
the existing SSE path (in every case no upstream turn has started, so
the resend cannot double-generate); a socket drop after open but before
a Responses terminal event errors the stream so relaySseWithFailedTail
synthesizes a response.failed terminal instead of a terminal-less clean
EOF. Caller metadata is preserved verbatim — no originator is invented
for callers that did not send one.

After patching, local benchmarks put opencodex within ~0.2s of direct
Codex CLI (Luna TTFT p50 4364ms -> 1424ms; Terra 3322ms -> 1417ms).
Verified tool-call round-trips, 630KB-1.5MB frames, context_length
error relay, and ~600 live requests with no new failure modes.

Known trade-off: Bun's WebSocket does not expose the 101 response
headers, so x-codex-*-reset-at quota hints are not visible on this
path; the periodic quota poller still covers quota tracking.

Regression tests cover root-level stream detection, providerFetch()
routing, frame relay (including WS-only frame dropping), SSE fallback
on upgrade rejection and send failure, mid-stream drop through the
passthrough relay (synthesized failed terminal), header preservation
without originator fabrication, and pre-open abort.
@kargnas

kargnas commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

@Wibias Thanks for the thorough review — all four blockers are addressed in ab6140a (rebased onto dev @ 4fed8d3):

  1. Root stream parseshouldUseCodexWsUpstream now parses the body and requires top-level stream === true. Tests cover nested {"metadata":{"stream":true}} (stays HTTP), whitespace-formatted JSON (routes), stream: "true" (stays HTTP), and malformed JSON (stays HTTP).

  2. ws.send() failure → SSE fallback — the catch block now settles with sseFallback(url, init) and closes the socket; no synthetic 200 is created, so the pre-stream HTTP error/refresh/failover machinery stays in charge. opened is only set after a successful send, so the close handler can't double-settle.

  3. Mid-stream drop errors the stream — an opened socket closing before a Responses terminal now calls controller.error(...) instead of close(). Added an integration test through relaySseWithFailedTail() asserting the relayed output contains the synthesized event: response.failed + data: [DONE] — no terminal-less stream can reach a client.

  4. No originator fabrication — the defaulting line is removed. A genuine caller originator is forwarded verbatim (test asserts both: absent stays absent, present is preserved). Agreed this belongs to a separately reviewed policy if ever wanted; this PR is now strictly a transport swap.

Also added the providerFetch() routing-boundary test you asked for (eligible → WS adapter, non-streaming / other-host / Request-object input → stubbed base fetch untouched).

tests/ws-upstream.test.ts: 11/11 pass on this head; tsc --noEmit clean.

@kargnas
kargnas marked this pull request as ready for review August 12, 2026 04:29
@github-actions
github-actions Bot marked this pull request as draft August 12, 2026 04:29

@Wibias Wibias left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-review on exact head ab6140a83db061e76b317454a1a43c5e909901bd.

The previous transport blockers are fixed on this head:

  • WebSocket selection parses the JSON body and requires root-level stream === true;
  • a synchronous ws.send() failure safely returns to the SSE fallback instead of exposing a synthetic 200/erroring body;
  • a socket close after open but before a Responses terminal errors the stream, and the relay regression verifies clients receive a synthesized response.failed + [DONE] rather than clean terminal-less EOF;
  • the wrapper no longer fabricates originator: codex_cli_rs; a genuine caller value is preserved verbatim;
  • response.create cannot be overridden by a request-body type field;
  • the shared providerFetch() routing boundary now has focused regression coverage.

I did not find a new code-level blocker in the current patch.

The remaining blocker is integration validation. Current dev is 70d2e1758c180188a729dd63812703b76cfeeba6; this head is 11 commits behind with merge base 4fed8d3fe431ad23be83f3aff2af18ef8b8ecd71. Exact-head Cross-platform CI and React Doctor are action_required, and the Cross-platform run contains 0 jobs, so the maintained matrix has not actually executed on this head. This changes the canonical upstream transport, so I do not want to approve it without a current integrated run.

The intervening dev commits do not modify these production transport files, so if the rebase is clean and the resulting exact-head maintained CI is green, I expect this to be ready for approval.

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants