Skip to content

test(budget): restore the 45s spawn signal and stop hardening a disposable port - #4834

Merged
lidge-jun merged 1 commit into
devfrom
codex/2580-windows-spawn-budget-signal
Sep 16, 2026
Merged

lidge-jun merged 1 commit into
devfrom
codex/2580-windows-spawn-budget-signal

Conversation

@lidge-jun

@lidge-jun lidge-jun commented Sep 16, 2026 •

Copy link
Copy Markdown
Owner

Summary

PR #4830 raised SPAWN_BUDGET_MS on win32 from 45s to 90s to fix one slow test case. The blast radius was much wider than the fix: 31 test files read that constant and nine hand it straight to setDefaultTimeout, so the edit reached 339 Windows cases — 315 went 45s → 90s, 22 that multiply it went 90s → 180s, and one derivation chain in codex-sync-api.test.ts reached 265s. Several of the affected files never spawn a process at all; the detectors that now report twice as late are exactly the contention ones (codex-write-lock, the cross-process history-lock exclusions, the sync-cache models_cache case, the Windows shim and main-account startup subprocess cases).

The 265s case matters beyond slow reporting. The Windows shards have a 30-minute job timeout (.github/workflows/ci.yml L772) and run bun test --isolate --timeout 60000 tests --shard=N/6 (L846), so an explicit per-test timeout overrides the 60s default and the job timeout becomes the only outer bound. Run 35129771091 measured Windows 5/6 at 26m39s and 6/6 at 25m13s. One hang in that 265s case puts its shard within roughly half a minute of an opaque job cancellation instead of a readable Bun timeout.

The measurement that justified #4830 was also contaminated by the test's own instrumentation. The child published its port with atomicWriteFile, the production secret writer, which on Windows runs hardenSecretPath(..., required: true) twice (src/config/atomic-write.ts), each able to spawn PowerShell for SID resolution and several icacls passes budgeted at 30s apiece. That ACL ceremony ran inside the window the parent measures as "time to reach a port" — performed on a disposable, non-secret port number.

What this changes:

  • SPAWN_BUDGET_MS returns to 45_000 on every platform and every call site.
  • A new COLD_SPAWN_BUDGET_MS (90s on win32, 45s elsewhere) is consumed exactly once: the readiness wait of the first proxy child spawned in native-profile-startup.test.ts. Every later child in that file and every other importer is back to 45s.
  • The child publishes its port and settled markers through a plain temp-file renameSync in the same directory. That preserves the only contract the parent has (macOS CI: native-profile process-exit phase test fails or hangs on release-train runs #1061: never observe the file between create and write) and removes the PowerShell/icacls ceremony from the measured window.
  • The child logs child-entry, start-server-begin, start-server-end, port-publish-begin and port-published, so the next slow run says where instead of forcing another forensic round. waitForPort's timeout message now also reports cold and budgetMs.
  • codex-sync-api.test.ts owns its bounds as literals instead of deriving them from a shared constant, and reports its own preparation window on every green run.
  • The test-budget.ts doc comment records the ablation reasoning for the one remaining Windows widening, as its own stated standard requires.

The fix is confirmed, not assumed

The added instrumentation settled both open questions on its first Windows run.

The 50.7s outlier behind #4830 was the ACL ceremony. With the port published by rename, run 35141541461 measured every readiness wait in native-profile-startup.test.ts at 2.0s–4.9s across all six Windows shards, first child included. The cold-start outlier does not reappear.

The Windows preparation reserve in codex-sync-api.test.ts was guarding a number nobody had measured ("CI observed 52.7s before the flip could even start"). The child now reports it: 2740ms on Windows, 423–575ms on Linux and macOS, with the whole case at 3675ms and 660–780ms. That evidence is what sizes the new bounds — boot 40s → 30s and the Windows preparation reserve 80s → 55s — taking the case from 265s to 95s. The bound still fits the 52.7s outlier it was written for: that much preparation leaves the flip its full boot budget and its reap inside COMPETING_OFF_CHILD_MS, so the tightening removes compounding without removing the protection.

COLD_SPAWN_BUDGET_MS is kept for the part one run cannot rule out — a genuinely cold runner rather than ACL work. It costs nothing while the fix holds, because nothing approaches it, and the comment says to delete rather than raise it if it is ever breached.

Verification

No local test suite, focused test, typecheck, build, or install was run for this change — this lane is under a standing no-local-execution constraint. Verification is static reasoning plus hosted GitHub Actions CI.

Hosted CI, head 4f89f0a7dcc6f82f772eb36a8a558ce6abac3e40:

  • Run 35145438663 (workflow_dispatch, lane all — Windows only runs on manual dispatch). Linux test 1/4–4/4, all gates, npm-global, keyring, docker smoke, api usage, storage policy, macOS 1/2 and 2/2: success. Windows 1/6, 2/6, 3/6, 4/6, 6/6: success on the first attempt; Windows 5/6 failed on the pre-existing codex-write-lock flake analysed below and is success on re-run (job 104975598799), where the same case passed in 2458ms with zero failures in the shard. Shard 6/6, which carries the retimed codex-sync-api case, completed in 25m29s.

Hosted CI, head d309d52655f1069ef46d15524bf820b5f209079c (this branch's first commit, same test-side change except the codex-sync-api constants):

  • Run 35141017582 (pull_request): success, all jobs.
  • Run 35141541461 (workflow_dispatch): all six Windows shards success (4/6 13m39s, 2/6 22m05s, 5/6 22m17s, 1/6 22m11s, 3/6 22m18s, 6/6 24m23s). The run as a whole shows cancelled only because the newer dispatch superseded it by concurrency group while the macos control serial lane was still running.

Windows 5/6 is a pre-existing flake in another file, not a regression

codex-write-lock.test.ts > two real processes contend for one lock > a second process is excluded while the first holds failed at 15014ms on error: timed out waiting for ...\held.

That is the file's internal waitFor deadline (INTERNAL_DEADLINE_MS, 15s), which this PR does not change; the case's Bun budget never expired. The failure reproduces on dev without this branch: run 35121570658, windows 5/6, failed the same way at 15695ms on held-env-HOME-differs-USERPROFILE-shared, before #4830 merged and before this branch existed.

The cause is visible in the source rather than inferred. tests/helpers/codex-write-lock-child.ts writes the held marker inside the lock callback, so the parent's 15s wait has to cover bun process spawn, the module graph including the production lock and its SQLite dependencies, and lock acquisition. The helper's own comment in codex-write-lock.test.ts records that boot as "8-19 s on a loaded windows-latest shard" — an observed range that straddles the 15s deadline waiting on it, so the case is red by construction under contention. spawnChild also resolves bun through PATH rather than process.execPath, which adds shim resolution to the same window on Windows.

The correct fix is the same shape as this PR's — publish a phase marker before the child attempts the lock, so "still booting" is distinguishable from "never acquired" — not a larger deadline. Both files are outside this lane's write scope, so it is reported rather than patched here.

Static checks performed:

  • Expanded every import site of SPAWN_BUDGET_MS (31 files, nine setDefaultTimeout consumers, four multiplication sites) to confirm the restore returns all of them to their pre-test(budget): give a Windows child spawn the cold-start headroom it measures #4830 bounds and that COLD_SPAWN_BUDGET_MS has exactly one consumer.
  • Confirmed native-profile-crash-boundaries.test.ts, the other spawner of the modified child helper, carries its own budget and is unaffected except by a faster publish.
  • Confirmed none of the modified files appear in tests/fixtures/file-size-baseline.json and that no test file is added, so the layout and size guards are untouched.
  • structure/ ownership covers src/ areas; this change is confined to tests/, so no structure doc is implicated.
  • Read src/config/atomic-write.ts to confirm the double hardenSecretPath(..., required: true) path that the rename-based publication avoids.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

On the last box: this PR stops a test fixture from routing a disposable port number through the production secret writer. It changes no production code path, no default, and no authorization surface. src/config/atomic-write.ts and the Windows ACL helpers are untouched here and belong to a separate lane.

Co-authored-by: lidge-jun lidge-jun@users.noreply.github.com

…sable port

PR #4830 raised SPAWN_BUDGET_MS on win32 from 45s to 90s to fix one test
case. 31 test files read that constant and nine hand it to
setDefaultTimeout, so the edit reached 339 Windows cases: 315 went 45s to
90s, 22 more that multiply it went 90s to 180s, and one derivation chain
in codex-sync-api reached 265s. The detectors that now report twice as
late are the contention ones -- codex-write-lock, the cross-process
history-lock exclusions, the shim process cases -- and several of the
affected files never spawn anything.

The measurement behind #4830 was also contaminated. The child published
its port through atomicWriteFile, the production SECRET writer, which on
Windows runs hardenSecretPath(..., required: true) twice, each able to
spawn PowerShell for SID resolution and several 30s-budgeted icacls
passes. That ACL ceremony ran inside the window the parent measures as
"time to reach a port" -- on a disposable port number.

- SPAWN_BUDGET_MS returns to 45s on every platform.
- COLD_SPAWN_BUDGET_MS (90s, win32 only) is consumed exactly once, by the
  readiness wait of the first proxy child in native-profile-startup.
- The child publishes its port and settled markers with a plain temp-file
  rename, preserving the #1061 no-partial-read contract without the ACL
  ceremony.
- The child logs child-entry, start-server-begin, start-server-end and
  port-published, so the next slow run names its own phase.
- codex-sync-api owns its bounds instead of deriving them, which returns
  that case to 130s and makes it immune to the next edit of a shared
  constant. It also reports its measured preparation window on green runs.

Co-authored-by: lidge-jun <lidge-jun@users.noreply.github.com>
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 16, 2026 19:30
@github-actions

Copy link
Copy Markdown
Contributor

✅ Deterministic PR hygiene checks passed.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-16T19:33:51.894357Z d309d52 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions github-actions Bot added the chore Maintenance, CI, tests, refactors, or build changes (not a user-facing bug or feature). label Sep 16, 2026
@coderabbitai

coderabbitai Bot commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Review Change StackReview 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: Advanced

Run ID: 3d1ea65e-3266-44ba-a384-72868330f67f

📥 Commits

Reviewing files that changed from the base of the PR and between e2304ce and d309d52.

📒 Files selected for processing (4)
  • tests/codex-integration/codex-sync-api.test.ts
  • tests/codex-integration/native-profile-startup.test.ts
  • tests/helpers/native-profile-startup-child.ts
  • tests/helpers/test-budget.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

Changes

The tests now use a dedicated cold-start budget for the first native startup child. Native startup diagnostics include phase timing and cold/warm budget details. Fixture files publish through temporary files and renames. The sync-race test uses fixed preparation budgets and surfaces preparation timing.

Startup timing and diagnostics

Layer / File(s) Summary
Cold-start budget contracts
tests/helpers/test-budget.ts
SPAWN_BUDGET_MS is fixed at 45 seconds. COLD_SPAWN_BUDGET_MS preserves the longer Windows allowance for the first child.
Native startup readiness flow
tests/codex-integration/native-profile-startup.test.ts, tests/helpers/native-profile-startup-child.ts
The first child uses the cold-start budget, later children use the standard budget, and timeout diagnostics include startup classification and elapsed time. The child logs startup phases and publishes port and settled files through temporary files followed by renames.
Sync-race preparation timing
tests/codex-integration/codex-sync-api.test.ts
The competing-OFF race uses fixed boot and preparation budgets. The child logs preparation time, and green parent runs print that measurement.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to d309d

The startup timing changes preserve the first-child allowance and do not show a current merge-blocking risk.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 4 files. 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 accurately summarizes the main changes: restoring the 45-second spawn budget and replacing hardened production-style file writes for disposable test ports. It is specific, concise, and relev…
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.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/2580-windows-spawn-budget-signal

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.

@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 72 / 80

지금 dev 끝은 #4825(e2304ce) 이고, 테스트 예산의 Windows 쪽은 그 아래에 깔린 #4830(1831193) 이 SPAWN_BUDGET_MS 를 win32에서 45초→90초로 올린 상태입니다. 이 PR(#4834, 헤드 d309d52)은 그 90초 확장을 되감고, 진짜로 필요한 여유는 새 상수 COLD_SPAWN_BUDGET_MS(win32만 90초) 로 딱 한 곳에만 남깁니다. 손대는 파일은 테스트 네 개뿐이고 프로덕션 src/ 는 건드리지 않습니다. types.ts/config.ts 분할 캠페인과도 무관해서 닫을 이유가 없습니다.

#4830 이 고치려던 증상은 native-profile-startup.test.ts 의 첫 프록시 자식이 포트 파일을 내기까지 약 50.7초가 걸린 한 번의 측정이었습니다. 그런데 그 상수를 올리면 그걸 읽는 테스트 파일이 31개, setDefaultTimeout 에 그대로 넘기는 곳이 9곳이라 Windows에서 약 339케이스가 한꺼번에 느려집니다. 315개는 45→90초, 곱셈을 쓰는 22개는 90→180초가 되고, codex-sync-api.test.ts 파생 체인은 265초까지 갑니다. Windows 샤드는 이미 25분 근처인데 잡 타임아웃이 30분이라, 265초짜리 하나가 멈추면 Bun 타임아웃 대신 잡 취소만 남는 위험도 있습니다. 게다가 그 50.7초 측정 안에는 테스트 픽스처가 일회용 포트 번호를 프로덕션 시크릿 기록기 atomicWriteFile 로 쓰면서 Windows ACL/icacls/PowerShell 의식이 들어간 시간이 섞여 있었습니다. 포트 숫자는 비밀이 아닌데 비밀 경로처럼 굳힌 셈입니다.

그래서 이 PR이 하는 일은 네 갈래입니다. (1) SPAWN_BUDGET_MS 를 다시 전 플랫폼 45초로 고정해서 #4830 이전의 실패 신호 속도를 되돌립니다. (2) COLD_SPAWN_BUDGET_MS 는 native-profile-startup.test.ts 에서 그 프로세스의 첫 자식 readiness 대기 한 번만 씁니다. (3) 자식 헬퍼는 포트·settled 마커를 같은 디렉터리 임시파일→renameSync 로 내서 #1061 계약(부분 파일을 읽지 않음)은 지키되 ACL 의식은 측정 창에서 뺍니다. 단계 로그(child-entry, start-server-begin, start-server-end, port-published)도 넣어서 다음 느린 실행이 어디인지 말하게 합니다. (4) codex-sync-api 경합 OFF 케이스는 공유 상수 파생을 끊고 리터럴(부트 40초, Windows 준비 80초 → 바깥 130초)로 소유해서 다음 SPAWN_BUDGET_MS 편집에 다시 끌려가지 않게 합니다. 초록 실행에서도 preparation elapsed를 남깁니다.

범위·근거·문서 주석이 맞물려 있고, MERGEABLE이며 직접 lidge-jun PR입니다. 호스티드 CI는 아직 돌고 있고(테스트/게이트/키링/macOS 등), 로컬 실행은 레인 제약으로 안 돌렸다고 본문에 명시되어 있습니다. Windows 샤드 로그에서 살아남은 readiness가 2.0~19.7초라는 주장과 50.7초의 오염 원인을 같이 보면, 45초 복원은 신호 회복이고 90초 콜드 한 방은 보험으로 읽힙니다. 머지 우선순위는 높은 편입니다.

라인 native-profile-startup.test.ts · coldSpawnPending / FIRST_CHILD_CASE_BUDGET_MS - 콜드 플래그는 spawnChild 호출 순서에 묶이고, 바깥 케이스 타임아웃 FIRST_CHILD_CASE_BUDGET_MS 는 파일 안 첫 스폰 케이스에 손으로 붙여 두었습니다. bun test --isolate 면 파일마다 프로세스가 새로 떠서 플래그 리셋은 맞지만, 이 파일 앞에 새 스폰 케이스를 끼우거나 순서가 바뀌면 readiness 예산은 첫 스폰을 따라가는데 넓은 바깥 타임아웃만 예전 케이스에 남을 수 있습니다. 지금은 주석으로 고정했지만, 나중에 케이스 추가할 때 깨지기 쉬운 결합입니다.
라인 native-profile-startup-child.ts · publishFixtureFile - 임시 경로가 path.pid.tmp 이라 rename 전에 프로세스가 죽으면 tmp가 남을 수 있습니다. 픽스처 루트가 케이스마다 갈리고 정리도 되므로 실무 위험은 작지만, 실패 로그에 tmp가 보이면 그게 이유일 수 있다는 점만 알아두면 됩니다.
경로 tests/helpers/test-budget.ts · COLD_SPAWN_BUDGET_MS - 문서가 '정확히 한 소비자'를 요구하는데, 현재 diff 기준으로 소비자는 native-profile-startup.test.ts 한 곳뿐입니다. 다른 파일이 나중에 import하면 콜드가 아닌데도 90초를 쓰기 쉬우니, 그 계약은 리뷰/구조 가드 쪽에서 계속 지켜야 합니다. (이번 PR 자체 문제는 아님.)
경로 CI / Verification - 본문이 로컬 테스트·타입체크·빌드를 돌리지 않았다고 솔직히 적었습니다. 판단 근거는 정적 import 전수와 호스티드 런 로그입니다. 지금 롤업은 hygiene/label/api usage 등은 통과, test 1-4·gates·keyring·macos·docker는 진행/대기 중이라 머지 버튼은 초록을 보고 누르는 게 맞습니다. 프로덕션 경로 변경이 없어서 회귀 면적은 테스트 신호 쪽에 모여 있습니다.

메인테이너의 판단이 필요한 지점

  • FIRST_CHILD_CASE_BUDGET_MS 를 파일 순서에 묶을지, 아니면 콜드 자식을 실제로 쓰는 케이스에만 바깥 예산을 붙이도록 헬퍼로 묶을지(유지보수 비용 vs 지금 주석 한 줄).
  • Windows 콜드 90초를 이번 런의 phase 타임스탬프가 확인한 뒤 더 줄일지, 아니면 45초 복원만으로도 충분한지 (본문도 '다음 느린 실행이 정한다'고 열어 둠).
  • codex-sync-api 130초를 더 조일지 여부. 실측은 수 초~10초대인데, 예비는 예전 52.7초 관측을 존중해 그대로 둔 선택이라 지금 라운드에서 조이지 않은 판단에 동의할지.

너의 추천
호스티드 CI(특히 Windows 관련·test shards·gates)가 초록이면 그대로 dev 에 머지하세요. #4830 의 과잉 확장을 되돌리면서 원인(시크릿 기록기로 포트 게시)까지 제거한 작지만 신호 가치가 큰 테스트-only 수정입니다. types/config 분할과 무관하고 중복 PR도 아니며, 라벨 교체나 추가 커밋 없이 머지 트레인이면 됩니다. 머지 후 남은 원본 PR 정리도 필요 없습니다(직접 lidge-jun 랜드).

이 댓글은 grok-bot이 작성했습니다

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d309d52655

ℹ️ 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".

function publishFixtureFile(path: string, content: string): void {
const tmp = `${path}.${process.pid}.tmp`;
writeFileSync(tmp, content, "utf8");
renameSync(tmp, path);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep the Windows-tolerant rename for fixture publication

On Windows, if Defender, an indexer, or a sync client briefly opens the newly written temporary file, this raw renameSync can fail with EBUSY, EPERM, or EACCES, causing the startup child to exit before publishing its port or settled marker. The previous atomicWriteFile path delegated to renameAtomicFile (src/config/atomic-write.ts), whose bounded retries exist specifically for these transient Windows sharing violations (src/lib/windows-atomic-replace.ts); retain the non-secret writer but use that retrying rename or an equivalent local retry so this Windows-flake fix does not introduce another intermittent failure.

Useful? React with 👍 / 👎.

@lidge-jun
lidge-jun merged commit ade8155 into dev Sep 16, 2026
53 of 54 checks passed
@lidge-jun
lidge-jun deleted the codex/2580-windows-spawn-budget-signal branch September 16, 2026 19:52
agentHits pushed a commit to agentHits/opencodex that referenced this pull request Sep 17, 2026
…sable port (lidge-jun#4834)

PR lidge-jun#4830 raised SPAWN_BUDGET_MS on win32 from 45s to 90s to fix one test
case. 31 test files read that constant and nine hand it to
setDefaultTimeout, so the edit reached 339 Windows cases: 315 went 45s to
90s, 22 more that multiply it went 90s to 180s, and one derivation chain
in codex-sync-api reached 265s. The detectors that now report twice as
late are the contention ones -- codex-write-lock, the cross-process
history-lock exclusions, the shim process cases -- and several of the
affected files never spawn anything.

The measurement behind lidge-jun#4830 was also contaminated. The child published
its port through atomicWriteFile, the production SECRET writer, which on
Windows runs hardenSecretPath(..., required: true) twice, each able to
spawn PowerShell for SID resolution and several 30s-budgeted icacls
passes. That ACL ceremony ran inside the window the parent measures as
"time to reach a port" -- on a disposable port number.

- SPAWN_BUDGET_MS returns to 45s on every platform.
- COLD_SPAWN_BUDGET_MS (90s, win32 only) is consumed exactly once, by the
  readiness wait of the first proxy child in native-profile-startup.
- The child publishes its port and settled markers with a plain temp-file
  rename, preserving the lidge-jun#1061 no-partial-read contract without the ACL
  ceremony.
- The child logs child-entry, start-server-begin, start-server-end and
  port-published, so the next slow run names its own phase.
- codex-sync-api owns its bounds instead of deriving them, which returns
  that case to 130s and makes it immune to the next edit of a shared
  constant. It also reports its measured preparation window on green runs.

Co-authored-by: lidge-jun <lidge-jun@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore Maintenance, CI, tests, refactors, or build changes (not a user-facing bug or feature).

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant