You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
e2e: studio-customize-journey intermittently loses a meta read to ECONNRESET in Live E2E UI and kicks PRs out of the merge queue #30524
Filing gate: ② a CI instrument defect with a named location, seen twice on 2026-11-05 on PRs whose diffs touch no meta-view, Studio or marketplace path. ⛔ Not a claim. No grade: triage sets it.
Business reason: when this spec flakes in the merge queue, the queue removes a green PR and rebuilds every PR queued behind it, which costs a full queue round each time.
What happens
ui/e2e/live/studio-customize-journey.spec.ts:121 ("a read-only base is customized, restored and extended through Studio, and its uninstall is refused") fails in step "Customize a view" with:
Error: apiRequestContext.get: read ECONNRESET
→ GET http://localhost:4010/api/v1/meta/view/showcase_task.in_progress
at servedColumns (ui/e2e/live/studio-customize-journey.spec.ts:61)
The other 16 live specs pass, including the 6 that run after it, so the server process stays up. The connection is reset rather than the request answered.
merge-group run 42037558126, job 127279783258 (PR #30463 kicked)
engine docblocks / codemod
The same spec is green on both PRs' own heads.
Ask
Find why that GET is reset mid-journey. Candidates to measure first: a server-side restart or socket close triggered by an earlier step of the journey (install / customize / restore), and keep-alive reuse of a socket the server has already closed. Fix the cause; ⛔ do not add a retry or skip that hides a real reset.
Reader who acts: owner of ui/e2e/live/** and the live e2e harness in CI (Live E2E UI job).
Dedupe: studio-customize-journey, ECONNRESET live e2e. New.
This answers domain:server#6's urgent ask (6660088834). Read fresh. There is a third hit today: the merge-group run 42040560124 (pr-30485 on fa9c0aa2, 13:58Z), job 127290410036. It is the same spec, the same step (servedColumns, GET /api/v1/meta/view/showcase_task.in_progress, read ECONNRESET), and 16 passed with 1 failed. PR fix(platform-objects): zh-CN metadata forms say 仪表盘 for dashboard #30485's diff is a zh-CN translation of 仪表盘, which is unrelated.
Not deterministic: the nine groups stacked behind pr-30485 (13:58Z, pr-30474 … pr-30395) ran the same Live E2E UI with --retries 0 and all passed. main push is not red from this. It is a queue red that ejects green PRs and rebuilds the queue behind them, three times in one day.
p1 under the standing order that a repeatedly red platform test gets fixed. domain:devx owns test reliability and the Live E2E UI harness. The fix may land in ui/e2e/live/**, or in the server if the measurement finds a socket close there. The card's own ⛔ holds: no retry and no skip that hides a real reset.
Measure first, as the card asks: a reset caused by an earlier journey step (install, customize, restore), and keep-alive reuse of a socket the server already closed.
Claim: PM loop round 1
Session: session_017ihL2ebbZkr2QAEG1x7UC8
Account: marchtian
Branch: claude/issue-30524-studio-journey-reset
Worktree: objectstack-issue-30524
Domain: domain:devx
Seat: domain:devx#2
File surface: measure first. The three hits are PR #30341 run 41981408406, merge-group job 127279783258 and merge-group job 127290410036. Each one is servedColumns (ui/e2e/live/studio-customize-journey.spec.ts:61) answering read ECONNRESET on GET /api/v1/meta/view/showcase_task.in_progress. The seat names the cause: a socket the server closes during an earlier journey step (install, customize, restore), keep-alive reuse of a socket already closed, or something else the measurement shows. The fix lands where the cause is. That is ui/e2e/live/** or the Live E2E UI harness in .github/workflows/ci.yml (Tier H) if the cause is the client or the harness. If the server closes the socket, the fix is a finding filed to domain:server with the evidence. ⛔ No retry, skip or timeout bump that hides a real reset.
Container & model: S, mode:subagent, model: default tier, effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — test-reliability card
Thread-read: 6660212976
Premise: holds (three hits on 2026-11-05 with unrelated diffs; triage 6660212976).
Serial constraints cleared: no open PR touches ui/e2e/live/**.
{
"cause": {
"class": "client keep-alive race (spec + Playwright APIRequestContext), not a server fault",
"mechanism": "Playwright 1.63 APIRequestContext pools sockets with http.Agent({ keepAlive: true }) and no agent timeout, so Node's agent ignores the server's 'Keep-Alive: timeout=5' hint and keeps a pooled socket until the server closes it. The backend (@hono/node-server, Node 22 defaults) closes an idle socket at keepAliveTimeout 5000 + keepAliveTimeoutBuffer 1000 = 6000 ms. In the spec, the threeReads GET after the customize step reuses the socket of the read before the browser steps, after about 5 s idle. When that idle reaches about 6 s, the GET is written to a socket the server is closing, and the read fails with ECONNRESET.",
"evidence_code": [
"ui/e2e/live/studio-customize-journey.spec.ts:61 at fa9c0aa2a0, the CI-failing tree (servedColumns GET), called from threeReads :80 at :159 right after publishPair :158; the previous read on the same context is :127",
"playwright-core 1.63.0 lib/coreBundle.js _ensureAgent: new http.Agent({ keepAlive: true }), no timeout",
"packages/plugins/plugin-hono-server/src/adapter.ts:1826 serve({ fetch, port }) with no keepAliveTimeout override; on Node 22.23.4, http.createServer() reads keepAliveTimeout 5000 and keepAliveTimeoutBuffer 1000"
],
"evidence_ci": [
"run 41981408406 attempt 1, job 127092282802: test 11 failed (6.5s) at 06:41:54Z, 'apiRequestContext.get: read ECONNRESET' on GET /api/v1/meta/view/showcase_task.in_progress, at servedColumns :61, threeReads :80, step :159; 16 passed; backend 'ready ... (pid 4933)' and 'stopped pid 4933'; attempt 2, job 127106735049: the same spec passed (11.0s)",
"merge-group job 127279783258: same error and stack, failed (6.5s) at 13:46:36Z; 16 passed; 'stopped pid 5815'",
"merge-group job 127290410036: same error and stack, failed (6.6s) at 14:06:25Z; 16 passed; 'stopped pid 4846'",
"the step before the failing read in all three: 'Customize a view' (Customize, then ensure-customization POST, then the draft PUT, then publish-drafts POST). The next spec passed within 4 s of each failure, and a backend boot takes 14 s, so the server was not restarted. The CI job log has no server lines (backend.log goes to a file); the backend.log artifact is NOT MEASURED (egress refused)."
],
"evidence_measured": [
"socket trace of the unfixed spec: the reused-socket idle before the servedColumns GET was 4710-5153 ms over 5 solo runs and 4785-5010 ms over 3 full-allowlist runs. That is the largest idle of any API read in the allowlist (next: the journey's object GET at 4219-4444 ms, studio-editor at 4007-4123 ms, studio-object-designer at 3498-3538 ms)",
"the real booted backend, the spec's GET on a pooled socket after an idle of 5994/5996/5998/6000 ms, 10 tries each: 7/40 failed ('read ECONNRESET' 3, 'socket hang up' 4), all at 5994-5996 ms; with Connection: close, 0/40",
"the same against a bare @hono/node-server process: pooled 2/32 resets at 5996-5999 ms; Connection: close 0/32"
]
},
"path": "a",
"fix": "PR #30555 (draft) at head e8662a4b6aeb897305e1aaf80b75bf93e5353e60. The spec overrides its request fixture: playwright.request.newContext({ extraHTTPHeaders: { Connection: 'close' } }), so every API read opens its own connection. Every assertion is unchanged; no retry, skip or timeout.",
"gates": {
"derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at e8662a4b6a: 19 commands",
"results": "all 19 exit 0: check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check:cross-package-test-inputs, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:registry-log-declared, check:rest-log-spy-declared, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher",
"ran_reconciliation": "Run reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero: all 19 recorded an exit code)",
"spec_green": "studio-customize-journey.spec.ts --repeat-each 12 --retries 0 at e8662a4b6a against a stack booted like the Live E2E UI job (start-backend.sh, vite preview proxying /api), with the gate sweep loading the box: 12 passed (3.4m). Socket trace of the fixed spec: 19 fresh connections, 0 reused",
"ci": "PR check-runs in_progress at report time"
},
"files_changed": ["ui/e2e/live/studio-customize-journey.spec.ts (+23 / -1)"],
"repro": {
"full_journey_red": "not reproduced locally: unfixed spec 20/20 alone and 51/51 in the CI allowlist x3; on this box the idle stays near 5 s, under the 6 s close",
"socket_level_red": "reproduced against the real backend and a bare hono server (see evidence_measured)",
"stack": "workspace backend built at fa9c0aa2a0 (turbo build with the job's filters), Console vite build, Node 22.23.4, Playwright 1.63.0, chromium-1243"
},
"deviations": [
"the CI backend.log artifacts (13394397183, 13419667226, 13421951722) could not be downloaded: the egress proxy refused the artifact blob host. The server log lines around the reset are NOT MEASURED; the no-restart reading rests on the job logs",
"the spec's green run used a stack built at the branch base fa9c0aa2a0, not rebuilt after the merge of origin/main at c045c34132; the diff is e2e-only",
"no changeset: ui/e2e/live is shipped by no package's files[] (ui/package.json is the private object-ui-monorepo), so skip-changeset rode the pr_create"
],
"mcp_calls": "6, all reads: get_job_logs x5 (127092282802, 127279783258, 127290410036 x2, 127106735049), actions_get download_workflow_run_artifact x1 (13394397183). No write tool.",
"api_writes": "2: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, run 42056299721, opened #30555 with label skip-changeset, read-back identical, no assignees) and POST /repos/objectstack-ai/objectstack/issues/30524/comments (this report, via post-stamped.mjs). git push is not a REST write.",
"filed_issues": []
}
{
"delta": "seat review of #30555: the spec's request override now passes the project's request-relevant use options by name (storageState, baseURL, userAgent, extraHTTPHeaders, ignoreHTTPSErrors), with Connection: close merged into any extra headers",
"pr": 30555,
"head": "a51f4c83a1509ecae9115f90fbd4706f6e96f202",
"previous_head": "e8662a4b6aeb897305e1aaf80b75bf93e5353e60",
"files_changed": ["ui/e2e/live/studio-customize-journey.spec.ts"],
"premise_reading": "on the previous head, before the change, a header probe found 17 of 17 spec requests carrying better-auth.session_token, both DELETEs included: the runner's runBeforeCreateRequestContext fills every newContext option the call leaves out from the project's use. The session was not dropped; the pass-through is now explicit rather than by default",
"repro": {
"spec_green": "studio-customize-journey.spec.ts --repeat-each 10 --retries 0 at a51f4c83a1, against a stack booted like the Live E2E UI job (start-backend.sh at e8662a4b6a, vite preview proxying /api): 10 passed (2.0m)",
"session_probe": "client header trace over those 10 runs: 170 of 170 spec requests (Connection: close) carry better-auth.session_token, DELETE /api/v1/packages/com.example.showcase and the cleanup DELETE of the pair included; 172 fresh connections, 0 reused"
},
"gates": {
"derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at a51f4c83a1: 19 commands, the same list as before",
"results": "all 19 exit 0",
"ran_reconciliation": "Run reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero: all 19 recorded an exit code)",
"type_check_e2e": "pnpm --dir ui run type-check:e2e (tsc -p tsconfig.e2e.json): exit 0",
"ci": "PR check-runs on the new head in_progress at report time"
},
"mcp_calls": "0 this round",
"api_writes": "1 this round: POST /repos/objectstack-ai/objectstack/issues/30524/comments (this note, via post-stamped.mjs); plus a git push of the branch",
"deviations": []
}
Landed · PR #30555 merged as 2ffdb64977 · 2026-11-05T16:42Z. The reset was the spec's API read reusing a keep-alive socket that the Node 22 backend closes at 6 s idle. The read after the customize step sat at about 5 s. The spec's request fixture now sends Connection: close and passes the project's storageState/baseURL on by name. Every assertion stays, and there is no retry or skip. ACCEPT 6662966040. If studio-editor or studio-object-designer ever red with the same read ECONNRESET signature, this fixture is the fix (their idles measured 3.5–4.1 s). The card closed through Fixes; pm:dispatched comes off in this stroke.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p1 ·
domain:devx· queue-ejecting flake · 2026-11-05T14:14Z⛔ Not a claim.
domain:server#6's urgent ask (6660088834). Read fresh. There is a third hit today: the merge-group run 42040560124 (pr-30485onfa9c0aa2, 13:58Z), job 127290410036. It is the same spec, the same step (servedColumns,GET /api/v1/meta/view/showcase_task.in_progress,read ECONNRESET), and 16 passed with 1 failed. PR fix(platform-objects): zh-CN metadata forms say 仪表盘 for dashboard #30485's diff is a zh-CN translation of 仪表盘, which is unrelated.pr-30485(13:58Z,pr-30474…pr-30395) ran the sameLive E2E UIwith--retries 0and all passed.mainpush is not red from this. It is a queue red that ejects green PRs and rebuilds the queue behind them, three times in one day.domain:devxowns test reliability and theLive E2E UIharness. The fix may land inui/e2e/live/**, or in the server if the measurement finds a socket close there. The card's own ⛔ holds: no retry and no skip that hides a real reset.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Claim: PM loop round 1
Session:
session_017ihL2ebbZkr2QAEG1x7UC8Account:
marchtianBranch:
claude/issue-30524-studio-journey-resetWorktree:
objectstack-issue-30524Domain:
domain:devxSeat:
domain:devx#2File surface: measure first. The three hits are PR #30341 run 41981408406, merge-group job 127279783258 and merge-group job 127290410036. Each one is
servedColumns(ui/e2e/live/studio-customize-journey.spec.ts:61) answeringread ECONNRESETonGET /api/v1/meta/view/showcase_task.in_progress. The seat names the cause: a socket the server closes during an earlier journey step (install, customize, restore), keep-alive reuse of a socket already closed, or something else the measurement shows. The fix lands where the cause is. That isui/e2e/live/**or theLive E2E UIharness in.github/workflows/ci.yml(Tier H) if the cause is the client or the harness. If the server closes the socket, the fix is a finding filed todomain:serverwith the evidence. ⛔ No retry, skip or timeout bump that hides a real reset.Container & model:
S,mode:subagent,model: default tier,effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — test-reliability card
Thread-read: 6660212976
Premise: holds (three hits on 2026-11-05 with unrelated diffs; triage 6660212976).
Serial constraints cleared: no open PR touches
ui/e2e/live/**.objectstack-fleet commentedon Nov 5, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
os-dev-report
{ "cause": { "class": "client keep-alive race (spec + Playwright APIRequestContext), not a server fault", "mechanism": "Playwright 1.63 APIRequestContext pools sockets with http.Agent({ keepAlive: true }) and no agent timeout, so Node's agent ignores the server's 'Keep-Alive: timeout=5' hint and keeps a pooled socket until the server closes it. The backend (@hono/node-server, Node 22 defaults) closes an idle socket at keepAliveTimeout 5000 + keepAliveTimeoutBuffer 1000 = 6000 ms. In the spec, the threeReads GET after the customize step reuses the socket of the read before the browser steps, after about 5 s idle. When that idle reaches about 6 s, the GET is written to a socket the server is closing, and the read fails with ECONNRESET.", "evidence_code": [ "ui/e2e/live/studio-customize-journey.spec.ts:61 at fa9c0aa2a0, the CI-failing tree (servedColumns GET), called from threeReads :80 at :159 right after publishPair :158; the previous read on the same context is :127", "playwright-core 1.63.0 lib/coreBundle.js _ensureAgent: new http.Agent({ keepAlive: true }), no timeout", "packages/plugins/plugin-hono-server/src/adapter.ts:1826 serve({ fetch, port }) with no keepAliveTimeout override; on Node 22.23.4, http.createServer() reads keepAliveTimeout 5000 and keepAliveTimeoutBuffer 1000" ], "evidence_ci": [ "run 41981408406 attempt 1, job 127092282802: test 11 failed (6.5s) at 06:41:54Z, 'apiRequestContext.get: read ECONNRESET' on GET /api/v1/meta/view/showcase_task.in_progress, at servedColumns :61, threeReads :80, step :159; 16 passed; backend 'ready ... (pid 4933)' and 'stopped pid 4933'; attempt 2, job 127106735049: the same spec passed (11.0s)", "merge-group job 127279783258: same error and stack, failed (6.5s) at 13:46:36Z; 16 passed; 'stopped pid 5815'", "merge-group job 127290410036: same error and stack, failed (6.6s) at 14:06:25Z; 16 passed; 'stopped pid 4846'", "the step before the failing read in all three: 'Customize a view' (Customize, then ensure-customization POST, then the draft PUT, then publish-drafts POST). The next spec passed within 4 s of each failure, and a backend boot takes 14 s, so the server was not restarted. The CI job log has no server lines (backend.log goes to a file); the backend.log artifact is NOT MEASURED (egress refused)." ], "evidence_measured": [ "socket trace of the unfixed spec: the reused-socket idle before the servedColumns GET was 4710-5153 ms over 5 solo runs and 4785-5010 ms over 3 full-allowlist runs. That is the largest idle of any API read in the allowlist (next: the journey's object GET at 4219-4444 ms, studio-editor at 4007-4123 ms, studio-object-designer at 3498-3538 ms)", "the real booted backend, the spec's GET on a pooled socket after an idle of 5994/5996/5998/6000 ms, 10 tries each: 7/40 failed ('read ECONNRESET' 3, 'socket hang up' 4), all at 5994-5996 ms; with Connection: close, 0/40", "the same against a bare @hono/node-server process: pooled 2/32 resets at 5996-5999 ms; Connection: close 0/32" ] }, "path": "a", "fix": "PR #30555 (draft) at head e8662a4b6aeb897305e1aaf80b75bf93e5353e60. The spec overrides its request fixture: playwright.request.newContext({ extraHTTPHeaders: { Connection: 'close' } }), so every API read opens its own connection. Every assertion is unchanged; no retry, skip or timeout.", "gates": { "derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at e8662a4b6a: 19 commands", "results": "all 19 exit 0: check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check:cross-package-test-inputs, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:registry-log-declared, check:rest-log-spy-declared, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher", "ran_reconciliation": "Run reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero: all 19 recorded an exit code)", "spec_green": "studio-customize-journey.spec.ts --repeat-each 12 --retries 0 at e8662a4b6a against a stack booted like the Live E2E UI job (start-backend.sh, vite preview proxying /api), with the gate sweep loading the box: 12 passed (3.4m). Socket trace of the fixed spec: 19 fresh connections, 0 reused", "ci": "PR check-runs in_progress at report time" }, "files_changed": ["ui/e2e/live/studio-customize-journey.spec.ts (+23 / -1)"], "repro": { "full_journey_red": "not reproduced locally: unfixed spec 20/20 alone and 51/51 in the CI allowlist x3; on this box the idle stays near 5 s, under the 6 s close", "socket_level_red": "reproduced against the real backend and a bare hono server (see evidence_measured)", "stack": "workspace backend built at fa9c0aa2a0 (turbo build with the job's filters), Console vite build, Node 22.23.4, Playwright 1.63.0, chromium-1243" }, "deviations": [ "the CI backend.log artifacts (13394397183, 13419667226, 13421951722) could not be downloaded: the egress proxy refused the artifact blob host. The server log lines around the reset are NOT MEASURED; the no-restart reading rests on the job logs", "the spec's green run used a stack built at the branch base fa9c0aa2a0, not rebuilt after the merge of origin/main at c045c34132; the diff is e2e-only", "no changeset: ui/e2e/live is shipped by no package's files[] (ui/package.json is the private object-ui-monorepo), so skip-changeset rode the pr_create" ], "mcp_calls": "6, all reads: get_job_logs x5 (127092282802, 127279783258, 127290410036 x2, 127106735049), actions_get download_workflow_run_artifact x1 (13394397183). No write tool.", "api_writes": "2: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, run 42056299721, opened #30555 with label skip-changeset, read-back identical, no assignees) and POST /repos/objectstack-ai/objectstack/issues/30524/comments (this report, via post-stamped.mjs). git push is not a REST write.", "filed_issues": [] }objectstack-fleet commentedon Nov 5, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
os-dev-report
{ "delta": "seat review of #30555: the spec's request override now passes the project's request-relevant use options by name (storageState, baseURL, userAgent, extraHTTPHeaders, ignoreHTTPSErrors), with Connection: close merged into any extra headers", "pr": 30555, "head": "a51f4c83a1509ecae9115f90fbd4706f6e96f202", "previous_head": "e8662a4b6aeb897305e1aaf80b75bf93e5353e60", "files_changed": ["ui/e2e/live/studio-customize-journey.spec.ts"], "premise_reading": "on the previous head, before the change, a header probe found 17 of 17 spec requests carrying better-auth.session_token, both DELETEs included: the runner's runBeforeCreateRequestContext fills every newContext option the call leaves out from the project's use. The session was not dropped; the pass-through is now explicit rather than by default", "repro": { "spec_green": "studio-customize-journey.spec.ts --repeat-each 10 --retries 0 at a51f4c83a1, against a stack booted like the Live E2E UI job (start-backend.sh at e8662a4b6a, vite preview proxying /api): 10 passed (2.0m)", "session_probe": "client header trace over those 10 runs: 170 of 170 spec requests (Connection: close) carry better-auth.session_token, DELETE /api/v1/packages/com.example.showcase and the cleanup DELETE of the pair included; 172 fresh connections, 0 reused" }, "gates": { "derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at a51f4c83a1: 19 commands, the same list as before", "results": "all 19 exit 0", "ran_reconciliation": "Run reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero: all 19 recorded an exit code)", "type_check_e2e": "pnpm --dir ui run type-check:e2e (tsc -p tsconfig.e2e.json): exit 0", "ci": "PR check-runs on the new head in_progress at report time" }, "mcp_calls": "0 this round", "api_writes": "1 this round: POST /repos/objectstack-ai/objectstack/issues/30524/comments (this note, via post-stamped.mjs); plus a git push of the branch", "deviations": [] }objectstack-fleet commentedon Nov 5, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Landed · PR #30555 merged as
2ffdb64977· 2026-11-05T16:42Z. The reset was the spec's API read reusing a keep-alive socket that the Node 22 backend closes at 6 s idle. The read after the customize step sat at about 5 s. The spec'srequestfixture now sendsConnection: closeand passes the project'sstorageState/baseURLon by name. Every assertion stays, and there is no retry or skip. ACCEPT 6662966040. Ifstudio-editororstudio-object-designerever red with the sameread ECONNRESETsignature, this fixture is the fix (their idles measured 3.5–4.1 s). The card closed throughFixes;pm:dispatchedcomes off in this stroke.