Summary
In the same long-running ChatGPT Web conversation using a developer-mode app backed by OpenAI Secure MCP Tunnel, two independent tool-heavy workflows stopped making progress after approximately 59 minutes.
In both incidents, ChatGPT Web remained on a tool-call state and did not continue automatically. The user could manually resume the conversation later, which began another workflow.
At the failure boundary, the local Streamable HTTP MCP server had already completed its work, tunnel-client remained live and ready, control-plane polling continued, the command queue was empty, and no response deadline, rejected response, response POST failure, EOF, 401/403, synthesized 502, process exit, or restart was recorded.
This report does not claim that Secure MCP Tunnel has a universal one-hour cutoff. Other workflows in the same local log exceeded one hour. I am asking whether ChatGPT Web/Work has a server-side turn or workflow lease that can expire around this boundary, and whether tunnel-client can expose the upstream termination reason when the control plane simply stops issuing commands for an otherwise active-looking ChatGPT turn.
Environment
- Client product: ChatGPT Web, Work mode, developer-mode app
- Browser: Microsoft Edge 152.0.4191.53
- Host: Windows 11 x64, build 26200
tunnel-client: 0.0.14+0f870e50a973fa820d4c409000059e181e8d242b
- Local MCP transport: Streamable HTTP on loopback
- Local MCP authentication: no application-layer OAuth or expiring bearer
- Control-plane route: HTTPS through a local HTTP proxy
mcp.connection_max_ttl: 8760h
- Tunnel ID, client instance ID, command IDs, account details, local paths, and repository contents are omitted
Incident timeline
All timestamps below are UTC+08:00.
| Incident |
First forwarded command |
Last forwarded command |
Observed duration |
Forwarded MCP commands |
| A |
2026-09-03 05:13:34.959 |
2026-09-03 06:13:24.700 |
3,589.741 s / 59m 49.741s |
190 |
| B |
2026-09-04 11:46:09.020 |
2026-09-04 12:44:49.509 |
3,520.489 s / 58m 40.489s |
294 |
The incidents have very different command counts but closely clustered elapsed durations.
Incident A
The ChatGPT UI appeared to stop at an apply_patch tool card. The local MCP runtime shows that this call did not hang:
2026-09-03T06:13:11.463+08:00
tool=apply_patch
status=error
code=PATCH_CONTEXT_NOT_FOUND
duration_ms=0
The error was an ordinary patch-context mismatch returned immediately. tunnel-client then forwarded later MCP requests at:
2026-09-03T06:13:12.118+08:00
2026-09-03T06:13:24.700+08:00
This shows that the locally displayed/stale tool card was not a still-running local apply_patch, and that the remote workflow continued to issue at least one later request before stopping.
Telemetry sampled from 06:12:35 through 06:13:45 reported:
diagnosis=healthy
local proxy process/listener=up
OpenAI direct reachability=ok
OpenAI proxy reachability=ok
independent direct canary=ok
independent proxy canary=ok
tunnel health=live
tunnel readiness=ready
deadline_drops=0
rejected_responses=0
control_plane_errors=0
eof_events=0
Incident B
The last real operating-system command completed successfully before ChatGPT stopped progressing:
2026-09-04T12:42:17.279+08:00 command started
2026-09-04T12:43:04.168+08:00 command completed
exit_code=0
elapsed_ms=46889
stdout_bytes=5825
stderr_bytes=0
output_persisted=true
After that completion, tunnel-client continued forwarding requests through 12:44:49.509. No later request for that workflow appeared.
Telemetry around the stop remained healthy:
12:44:42 enqueued=1717 polled=1717 queue=0 worker_occupancy=0 live=1 ready=1
12:45:42 enqueued=1718 polled=1718 queue=0 worker_occupancy=0 live=1 ready=1
12:46:52 enqueued=1718 polled=1718 queue=0 worker_occupancy=0 live=1 ready=1
From 12:44:22 through 12:45:12, every local and remote reachability probe remained healthy. The tunnel-client process and the local MCP host remained running and did not restart.
The log contains no failure at the 12:44:49 boundary matching any of the following:
command response deadline reached
failed to post response
rejected response
unexpected EOF
client_internal 502
transport closed
401 / 403
process exit or restart
Why this does not appear to be a universal local one-hour cutoff
The same tunnel-client log contains other workflows with the following first-to-last-command durations:
102.82 minutes / 208 commands
100.82 minutes / 408 commands
79.91 minutes / 244 commands
75.62 minutes / 198 commands
68.64 minutes / 202 commands
68.56 minutes / 231 commands
65.42 minutes / 148 commands
61.21 minutes / 197 commands
Therefore neither a universal tunnel-client 60-minute cutoff nor a universal 300-command cutoff fits the observed data.
The narrower observation is that two failures in the same ChatGPT conversation clustered at 58m40s and 59m50s despite substantially different command counts.
Publicly reported adjacent behavior
A separate local-tools bridge reported a closely related symptom: its MCP handler returned, pending tool count returned to zero, the local background result remained healthy and readable, but ChatGPT issued no follow-up poll and the turn remained stuck as generating. The reporter concluded that the evidence pointed to the ChatGPT turn/tool orchestrator rather than the local MCP process:
I also compared this incident against known tunnel-client reports:
The present incidents do not have those signatures, use loopback Streamable HTTP rather than stdio, and occurred on v0.0.14.
Reproduction pattern
- Run
tunnel-client v0.0.14 against a loopback Streamable HTTP MCP server.
- Use the resulting developer-mode app in a ChatGPT Web Work conversation.
- Keep one tool-heavy workflow active for roughly an hour, with many short MCP calls and some bounded background-command polling.
- Observe that ChatGPT stops issuing commands and the Web UI remains at the last visible tool state.
- Observe locally that the last command completed, the tunnel queue drained,
/healthz and /readyz remain successful, and control-plane polling continues.
- Manually resume the same conversation; tool use can continue in a new workflow.
This has occurred twice in the same conversation. It is not yet a deterministic synthetic reproducer.
Expected behavior
At least one of the following should occur:
- The ChatGPT workflow continues after the terminal MCP result is accepted.
- If the ChatGPT turn/workflow is intentionally bounded, the Web UI exposes an explicit terminal state instead of remaining on a stale tool card.
- The control plane exposes a privacy-safe, machine-readable reason such as
workflow_completed, workflow_expired, caller_disconnected, turn_cancelled, or response_not_consumed.
tunnel-client diagnostics make it possible to distinguish "the control plane has no more commands because the workflow ended" from "the workflow is still active but its tool loop is stalled."
Questions
- Is there a ChatGPT Web/Work server-side turn, workflow, tool-orchestrator, or connector-binding lease near 60 minutes that is separate from
mcp.connection_max_ttl?
- Can maintainers inspect the two exact workflow IDs privately and determine their server-side terminal reason?
- Does a successful terminal-response POST only acknowledge receipt by the tunnel service, or is there any observable acknowledgement that the ChatGPT workflow consumed that result?
- Is there an existing control-plane field, endpoint, debug mode, or support archive entry that records why a workflow stopped issuing commands?
- If this belongs to a ChatGPT Web/Work tracker rather than
tunnel-client, what is the correct public or private reporting channel for preserving the workflow IDs and timestamps?
Available evidence
I can provide privately or in a further sanitized attachment:
- the two complete workflow IDs;
- command request IDs around both stop boundaries;
- a redacted
tunnel-client log slice;
- the local MCP runtime lifecycle slice;
- per-10-second network and tunnel telemetry;
- process start/uptime evidence;
- queue, worker-pool, liveness, readiness, and poll-success metrics.
No prompt text, source code, command output, local repository path, API key, bearer token, tunnel ID, account identifier, or private network endpoint needs to be disclosed.
Summary
In the same long-running ChatGPT Web conversation using a developer-mode app backed by OpenAI Secure MCP Tunnel, two independent tool-heavy workflows stopped making progress after approximately 59 minutes.
In both incidents, ChatGPT Web remained on a tool-call state and did not continue automatically. The user could manually resume the conversation later, which began another workflow.
At the failure boundary, the local Streamable HTTP MCP server had already completed its work,
tunnel-clientremained live and ready, control-plane polling continued, the command queue was empty, and no response deadline, rejected response, response POST failure, EOF, 401/403, synthesized 502, process exit, or restart was recorded.This report does not claim that Secure MCP Tunnel has a universal one-hour cutoff. Other workflows in the same local log exceeded one hour. I am asking whether ChatGPT Web/Work has a server-side turn or workflow lease that can expire around this boundary, and whether
tunnel-clientcan expose the upstream termination reason when the control plane simply stops issuing commands for an otherwise active-looking ChatGPT turn.Environment
tunnel-client:0.0.14+0f870e50a973fa820d4c409000059e181e8d242bmcp.connection_max_ttl:8760hIncident timeline
All timestamps below are UTC+08:00.
The incidents have very different command counts but closely clustered elapsed durations.
Incident A
The ChatGPT UI appeared to stop at an
apply_patchtool card. The local MCP runtime shows that this call did not hang:The error was an ordinary patch-context mismatch returned immediately.
tunnel-clientthen forwarded later MCP requests at:This shows that the locally displayed/stale tool card was not a still-running local
apply_patch, and that the remote workflow continued to issue at least one later request before stopping.Telemetry sampled from 06:12:35 through 06:13:45 reported:
Incident B
The last real operating-system command completed successfully before ChatGPT stopped progressing:
After that completion,
tunnel-clientcontinued forwarding requests through 12:44:49.509. No later request for that workflow appeared.Telemetry around the stop remained healthy:
From 12:44:22 through 12:45:12, every local and remote reachability probe remained healthy. The
tunnel-clientprocess and the local MCP host remained running and did not restart.The log contains no failure at the 12:44:49 boundary matching any of the following:
Why this does not appear to be a universal local one-hour cutoff
The same
tunnel-clientlog contains other workflows with the following first-to-last-command durations:Therefore neither a universal
tunnel-client60-minute cutoff nor a universal 300-command cutoff fits the observed data.The narrower observation is that two failures in the same ChatGPT conversation clustered at 58m40s and 59m50s despite substantially different command counts.
Publicly reported adjacent behavior
A separate local-tools bridge reported a closely related symptom: its MCP handler returned, pending tool count returned to zero, the local background result remained healthy and readable, but ChatGPT issued no follow-up poll and the turn remained stuck as generating. The reporter concluded that the evidence pointed to the ChatGPT turn/tool orchestrator rather than the local MCP process:
I also compared this incident against known
tunnel-clientreports:unexpected EOFduring control-plane long polling #51: proxied long-pollunexpected EOF, followed by automatic recoveryThe present incidents do not have those signatures, use loopback Streamable HTTP rather than stdio, and occurred on v0.0.14.
Reproduction pattern
tunnel-clientv0.0.14 against a loopback Streamable HTTP MCP server./healthzand/readyzremain successful, and control-plane polling continues.This has occurred twice in the same conversation. It is not yet a deterministic synthetic reproducer.
Expected behavior
At least one of the following should occur:
workflow_completed,workflow_expired,caller_disconnected,turn_cancelled, orresponse_not_consumed.tunnel-clientdiagnostics make it possible to distinguish "the control plane has no more commands because the workflow ended" from "the workflow is still active but its tool loop is stalled."Questions
mcp.connection_max_ttl?tunnel-client, what is the correct public or private reporting channel for preserving the workflow IDs and timestamps?Available evidence
I can provide privately or in a further sanitized attachment:
tunnel-clientlog slice;No prompt text, source code, command output, local repository path, API key, bearer token, tunnel ID, account identifier, or private network endpoint needs to be disclosed.