Skip to content

ci: run installed npm acceptance nightly instead of on PR updates - #15719

Merged
yiliang114 merged 3 commits into
mainfrom
fix/installed-acceptance-nightly
Oct 28, 2026
Merged

yiliang114 merged 3 commits into
mainfrom
fix/installed-acceptance-nightly

Conversation

@yiliang114

@yiliang114 yiliang114 commented Oct 27, 2026 •

Copy link
Copy Markdown
Collaborator

What this PR does

Run installed npm/private Bun acceptance and its four-platform distribution matrix nightly at 03:17 Asia/Shanghai (19:17 UTC), or by manual dispatch, instead of on every PR update. Nightly runs skip the source TUI lanes; existing source TUI PR filtering and manual behavior stay unchanged. All product assertions, native hosts, toolchains and canonical artifact dependencies remain intact.

Scheduled failures on main also enter the existing deduplicated CI issue reporter. Repeated test failures reuse their tracker; infrastructure-only failures retain the existing one-rerun policy. PR and manual runs do not enter this new reporting route.

Why it's needed

The installed jobs bypass the existing impact classifier: a one-line Java test change still queued installed acceptance. Five successful runs sampled today had a median producer queue of 67.3 minutes versus 8.8 minutes executing. The producer and four consumers used 90.7–108.5 total runner minutes per run. Broad PR triggers make that cost recur for unrelated changes.

Reviewer Test Plan

How to verify

  • On a PR update, installed acceptance and its dependent distribution matrix should be skipped; source TUI jobs should retain their existing impact classification and fail-closed behavior.

  • On a scheduled run, only the installed producer and its successful-producer-dependent matrix should execute. The classifier and source TUI jobs should skip.

  • A manual dispatch against a selected ref should still run source TUI and installed acceptance. A failed producer must not start distribution consumers without a canonical artifact.

  • A failed nightly run on main should create or reuse the existing failure issue after normal infrastructure/stale-attempt handling. Success, cancellation, skipping, PR and manual runs should not file through this new route.

Evidence (Before & After)

N/A for product UI. Scheduling regression tests failed in two places against the original workflow, then all 76 workflow tests passed after the change. All 92 runner-routing tests passed. ESLint, formatting, CI budget, workflow size, diff checks and bilingual links passed. Actionlint passed with only the unchanged macos-15-intel unknown-label diagnostic excluded because the local validator's runner inventory is older. Independent static correctness review found no issues.

The reporting follow-up added a failing regression for the missing workflow watch and schedule route; after wiring both, all 287 tests across the failure reporter, CI platform lanes and TUI/E2E workflow suites passed, including existing issue-reuse tests. Reporter actionlint passed without exclusions. No synthetic GitHub failure or issue was created to test reporting.

Tested on

OS Status
macOS Targeted workflow tests and static checks passed
Windows Not run
Linux Not run

Risk & Scope

  • Installation regressions can now be found on the next nightly run rather than before merge. Maintainers should manually validate high-risk installation/runtime changes and the exact release candidate before publishing.
  • Full local build failed because the reused dependency tree resolves Playwright 1.58.2 instead of the current expected 1.62.1. Full typecheck also failed with missing workspace build declarations and dependency errors. These checks are not claimed green. No product source or dependency inputs changed.
  • No live four-platform run was dispatched for this scheduling-only change. The daily schedule activates after merge to the default branch and may be delayed by GitHub queueing. Existing queued runs are not cancelled; no release gate is automatically added.
  • Design: English / įŪ€ä―“äļ­æ–‡.

Linked Issues

Maintainer-requested follow-up to observed CI queueing; no linked issue.

äļ­æ–‡čŊŽ

æ”đåŠĻ内åŪđ

npm åŪ‰čĢ…åŠį§æœ‰ Bun 驌æ”ķ和后įŧ­å››åđģ台分发įŸĐé˜ĩæ”đäļšæŊåĪĐ北䚎æ—ķé—ī 03:17UTC 19:17或手åŠĻč§Ķ发äļå†éšæŊæŽĄ PR æ›īæ–°æ‰§čĄŒã€‚åΜé—īč·ģčŋ‡æšį  TUI äŧŧåŠĄïž›įŽ°æœ‰æšį  TUI įš„ PR čŋ‡æŧĪ及手åŠĻ行äļšäŋæŒäļå˜ã€‚å…ĻéƒĻ䚧品断čĻ€ã€åŽŸį”Ÿåđģ台、å·Ĩ具é“ū和å”Ŋäļ€äš§į‰Đäūčĩ–äļå˜ã€‚

main åΜé—īåĪąčīĨ同æ—ķæŽĨå…Ĩå·ēæœ‰įš„åŽŧ重 CI issue æŠĨ障æĩįĻ‹ã€‚é‡åĪæĩ‹čŊ•åĪąčīĨåĪį”Ļ跟čļŠå•įšŊåŸšįĄ€čŪūæ–―åĪąčīĨäŋį•™å·ēæœ‰įš„éĶ–æŽĄé‡č·‘į­–į•Ĩ。PR 和手åŠĻčŋčĄŒäļčŋ›å…Ĩ新åĒžæŠĨ障č·Ŋåū„。

原因

åŪ‰čĢ…äŧŧåŠĄįŧ•čŋ‡äš†įŽ°æœ‰å―ąå“åˆ†įąŧå™Ļïžšäŧ…äŋŪæ”đäļ€čĄŒ Java æĩ‹čŊ•įš„ PR äŧį„ķæŽ’é˜Ÿį­‰åū…åŪ‰čĢ…éŠŒæ”ķ。äŧŠåĪĐé‡‡æ ·įš„äš”æŽĄæˆåŠŸčŋčĄŒäļ­ïžŒäš§į‰Đį”ŸæˆäŧŧåŠĄæŽ’é˜Ÿäļ­ä―æ•°äļš 67.3 åˆ†é’ŸïžŒč€Œæ‰§čĄŒäļ­ä―æ•°äŧ… 8.8 分钟。䚧į‰Đį”ŸæˆåŠå››äļŠæķˆčīđ者æŊč―ŪįīŊčŪĄä―ŋį”Ļ 90.7–108.5 runner 分钟。åŪ―æģ›įš„ PR č§Ķå‘čŒƒå›īčŪĐæ— å…ģæ”đåŠĻäđŸååĪæ‰ŋ担čŋ™äˆæœŽã€‚

čŊ„åŪĄéŠŒčŊčŪĄåˆ’

驌čŊæ–đ垏

  • PR æ›īæ–°åš”č·ģčŋ‡åŪ‰čĢ…éŠŒæ”ķ及å…ķäūčĩ–įš„åˆ†å‘įŸĐé˜ĩïž›æšį  TUI äŧŧåŠĄäŋæŒæ—Ēæœ‰å―ąå“åˆ†įąŧ和分įąŧåĪąčīĨäŧæ‰§čĄŒįš„čĄŒäļšã€‚

  • åۚæ—ķčŋčĄŒåš”äŧ…æ‰§čĄŒåŪ‰čĢ…äš§į‰Đį”ŸæˆäŧŧåŠĄåŠäūčĩ–å…ķæˆåŠŸįš„įŸĐé˜ĩ分įąŧå™Ļå’Œæšį  TUI äŧŧåŠĄč·ģčŋ‡ã€‚

  • 手åŠĻ选æ‹Đ ref čŋčĄŒäŧå𔿉§čĄŒæšį  TUI 和åŪ‰čĢ…éŠŒæ”ķ。䚧į‰Đį”ŸæˆåĪąčīĨæ—ķäļåš”åœĻįžšå°‘å”Ŋäļ€äš§į‰Đįš„æƒ…å†ĩäļ‹åŊåŠĻ分发æķˆčīđč€…ã€‚

  • main åΜé—īåĪąčīĨåš”åœĻæēŋį”ĻåŸšįĄ€čŪūæ–―åŠæ—§ attempt åĪ„į†č§„åˆ™åŽåˆ›åŧšæˆ–åĪį”Ļå·ē有åĪąčīĨ issue。成功、取æķˆã€č·ģčŋ‡ã€PR 和手åŠĻčŋčĄŒäļåš”通čŋ‡æ–°åĒžč·Ŋåū„åŧšå•。

前后čŊæŪ

䚧品 UI äļé€‚į”Ļã€‚č°ƒåšĶå›žå―’æĩ‹čŊ•åœĻ旧å·Ĩä―œæĩäœ‰äļĪéĄđåĪąčīĨäŋŪæ”đ后 76 éĄđå·Ĩä―œæĩæĩ‹čŊ•å…ĻéƒĻ通čŋ‡ã€‚92 éĄđ runner č·Ŋį”ąæĩ‹čŊ•å…ĻéƒĻ通čŋ‡ã€‚ESLint、栞垏、CI éĒ„įŪ—ã€å·Ĩä―œæĩä―“į§Ŋ、diff æĢ€æŸĨ及双čŊ­é“ūæŽĨæĢ€æŸĨ通čŋ‡ã€‚Actionlint äŧ…排é™Ī朊äŋŪæ”đįš„ macos-15-intel 朊įŸĨ标į­ūčŊŠæ–­åŽé€ščŋ‡ïžŒåŽŸå› æ˜ŊæœŽæœšæ ĄéŠŒå™Ļįš„ runner æļ…单čūƒæ—§ã€‚į‹ŽįŦ‹é™æ€æ­ĢįĄŪ性čŊ„åŪĄæœŠå‘įŽ°é—ŪéĒ˜ã€‚

æŠĨ障čĄĨ充先通čŋ‡å›žå―’æĩ‹čŊ•įĄŪčŪĪįžšå°‘į›‘åŽåŠåۚæ—ķč·Ŋį”ąäžšåĪąčīĨïž›æŽĨå…Ĩ后åĪąčīĨæŠĨ告、CI åđģ台äŧŧåŠĄå’Œ TUI/E2E å·Ĩä―œæĩäļ‰äļŠåĨ—äŧķå…ą 287 éĄđæĩ‹čŊ•通čŋ‡ïžŒåŒ…åŦå·ē有 issue åĪį”Ļæĩ‹čŊ•。æŠĨ告å·Ĩä―œæĩ actionlint 无需排é™ĪéĄđåģ通čŋ‡ã€‚æēĄæœ‰äļšéЌčŊæŠĨ障而åˆķ造 GitHub åĪąčīĨ或æĩ‹čŊ• issue。

æĩ‹čŊ•åđģ台

åđģ台 įŠķ态
macOS 针åŊđæ€§å·Ĩä―œæĩæĩ‹čŊ•和静态æĢ€æŸĨ通čŋ‡
Windows 朊čŋčĄŒ
Linux 朊čŋčĄŒ

éĢŽé™ĐäļŽčŒƒå›ī

  • åŪ‰čĢ…å›žå―’åŊčƒ―åŧķčŋŸåˆ°äļ‹äļ€æŽĄåΜé—īčŋčĄŒå‘įŽ°ïžŒč€Œäļæ˜ŊåœĻ合åđķå‰å‘įŽ°ã€‚įŧĪč€…åš”åœĻ合åđķ前手åŠĻ驌čŊéŦ˜éĢŽé™ĐåŪ‰čĢ…/čŋčĄŒæ—ķæ”đåŠĻåđķåœĻ发åļƒå‰éЌčŊå…·ä―“å€™é€‰į‰ˆæœŽã€‚
  • 朎地å…Ļ量构åŧšåĪąčīĨïžšåĪį”Ļįš„äūčĩ–æ ‘č§Ģ析到 Playwright 1.58.2ïžŒč€Œå―“å‰äŧĢ᠁čĶæą‚ 1.62.1。å…Ļ量įąŧ型æĢ€æŸĨäđŸå› įžšåĪąå·Ĩä―œåŒšæž„åŧšåĢ°æ˜Žå’Œäūčĩ–é”™čŊŊåĪąčīĨäļå̰᧰čŋ™äš›æĢ€æŸĨ通čŋ‡ã€‚æēĄæœ‰äŋŪæ”đäš§å“æšį æˆ–äūčĩ–čū“å…Ĩ。
  • æœŽæŽĄäŧ…č°ƒæ•ī调åšĶæēĄæœ‰č§Ķå‘įœŸåŪžå››åđģ台銌æ”ķ。æŊæ—ĨäŧŧåŠĄåˆå…Ĩéŧ˜čŪĪ分æ”ŊåŽį”Ÿæ•ˆïžŒåŊčƒ―å— GitHub 排队åŧķčŋŸå―ąå“ã€‚äļå–æķˆæ—Ē有排队äŧŧåŠĄïžŒäļč‡ŠåŠĻåĒžåŠ å‘åļƒé—ĻįĶã€‚
  • čŪūčŪĄïžšEnglish / įŪ€ä―“äļ­æ–‡ã€‚

å…ģ联é—Ūéǘ

įŧĪ者针åŊđ观åŊŸåˆ°įš„ CI 排队čĶæą‚čŋ›čĄŒįš„æ”đčŋ›ïžŒæ— å…ģ联 issue。

@wenshao

wenshao commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

å·ēčŊ„åŪĄæäšĪ 03257a003b5f07e3237303c2f3711e2797989e09。įŧ“čŪšïžšC=0S=1ïž›æœŠå‘įŽ°é˜ŧåĄžé—ŪéĒ˜ã€‚

调åšĶæ”đåŠĻįŽĶ合čŪūčŪĄïžšPR æ›ī新č·ģčŋ‡åŪ‰čĢ…éŠŒæ”ķ及äļļ分发įŸĐé˜ĩïž›åۚæ—ķčŋčĄŒč·ģčŋ‡åˆ†įąŧå™Ļ和äļĪäļŠæšį  TUI äŧŧåŠĄïž›æ‰‹åŠĻčŋčĄŒäŋį•™å…ĻéƒĻäŧŧåŠĄã€‚åˆ†å‘įŸĐé˜ĩäŧé€ščŋ‡ needs: installed-npm 和éŧ˜čŪĪįš„æˆåŠŸæĄäŧķį­‰åū…äš§į‰Đį”ŸæˆäŧŧåŠĄïžŒæœŠæ”ūåŪ―åĪąčīĨ或č·ģčŋ‡æ—ķįš„æ‰§čĄŒæĄäŧķ。PR 分įąŧåĪąčīĨæ—ķįŧ§įŧ­æ‰§čĄŒæšį æĢ€æŸĨįš„čĄŒäļšã€åđķ发取æķˆį­–į•Ĩ、四åđģ台įŸĐé˜ĩ、䚧į‰Đå…ģč”å’Œå·Ĩ具é“ū均äŋæŒäļå˜ã€‚äļ­č‹ąæ–‡čŪūčŪĄæ–‡æĄĢ内åŪđäļ€č‡ī。

S1非é˜ŧåĄžïž‰ïžšåŧščŪŪčĄĨ充åΜé—īåĪąčīĨįš„č‡ŠåŠĻæŠĨ障。 新åĒžįš„ schedule 尚朊æŽĨå…Ĩäŧ“åš“įŽ°æœ‰įš„ Main CI Failure Issue æĩįĻ‹ïžšå…ķ workflow_run į›‘åŽåˆ—čĄĻ 和 schedule 允čŪļ列čĄĻ éƒ―äļåŒ…åŦ tui-parity因æ­ĪåΜé—īåŪ‰čĢ…éŠŒæ”ķåĪąčīĨäļäžšé€ščŋ‡čŊĨæĩįĻ‹åˆ›åŧšæˆ–æ›ī新故障 issue。åŪ‰čĢ…æĢ€æŸĨ退凚 PR 后åŧščŪŪ后įŧ­åŒæ—ķčĄĨé―čŋ™äļĪåĪ„åŠåŊđåš”å·Ĩä―œæĩæĩ‹čŊ•äūŋ䚎įŧĪč€…č·Ÿčŋ›åĪąčīĨ。čŋ™äļå―ąå“æœŽæŽĄč°ƒåšĶé€ŧčū‘įš„æ­ĢįĄŪ性。

į‹ŽįŦ‹éЌčŊïžš

  • åœĻįēūįĄŪ提äšĪįš„į‹ŽįŦ‹åŋŦį…§äļŠčŋčĄŒ e2e-workflow.test.jsïžš76/76 通čŋ‡ïž›runner č·Ŋį”ąæĩ‹čŊ•通čŋ‡ã€‚
  • Actionlint įš„å·Ĩä―œæĩčŊ­æģ•å’ŒčĄĻčūūåžæ ĄéŠŒé€ščŋ‡ïžˆį́į”ĻåĪ–éƒĻ ShellCheck/PyflakesPrettier、CI éĒ„įŪ—ã€å·Ĩä―œæĩä―“į§Ŋ、diff æĢ€æŸĨ及双čŊ­æ–‡æĄĢé“ūæŽĨæĢ€æŸĨ通čŋ‡ã€‚
  • å·ēæ ļåŊđįŽ°æœ‰čŊ„åŪĄįšŋįĻ‹ïžŒæēĄæœ‰åū…åĪæ ļįš„åŽ†åē Critical。

驌čŊčūđį•ŒïžšæœŽæŽĄæœŠæ‰§čĄŒå…Ļ量 build/typecheck æˆ–įœŸåŪžå››åđģ台åŪ‰čĢ…éŠŒæ”ķ最čŋ‘äļ€æŽĄæŸĨčŊĒæ—ķčŋœįŦŊ CI äŧæœ‰äŧŧåŠĄčŋčĄŒäļ­ã€‚åŪ‰čĢ…å›žå―’åŧķčŋŸåˆ°åΜé—īå‘įŽ°įš„å–čˆå·ēåœĻčŪūčŪĄå’Œ PR čŊŽäļ­æ˜ŽįĄŪčŪ°å―•ïžŒäļä―œäļšįžšé™·é‡åĪæå‡šã€‚

@yiliang114

Copy link
Copy Markdown
Collaborator Author

朎地銌čŊïžˆhead 43dcb55802b20dab9a1c573bf314e273c769aad0隔įĶŧ worktreeïžŒį‹ŽįŦ‹äūčĩ–树

éĄđ å‘―äŧĪ įŧ“æžœ
workflow meta-tests npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/e2e-workflow.test.js scripts/tests/main-ci-failure-issue-workflow.test.js exit 0 — 2 files / 226 tests passed, 39.46s
workflow č§Ķ发éĒhead YAML sed -n '1,30p' .github/workflows/tui-parity.yml on: = pull_request + workflow_dispatch + schedule: cron '17 19 * * *'
åŪ‰čĢ…éŠŒæ”ķé—Ļ grep -n "event_name ==" .github/workflows/tui-parity.yml installed-npm įš„ if = github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'L250分发įŸĐé˜ĩäŧ needs: 'installed-npm'L300朊æ”ūåŪ―æˆåŠŸæĄäŧķ

PR č§Ķ发éĒåŪžæĩ‹ïžˆå―“前 head įš„ tui-parity run

check įŧ“æžœ
Installed npm global and npx (${{ matrix.target }}) skipped
Installed npm Node26 private Bun acceptance skipped
TUI parity snapshots (ink vs opentui) success (31m27s)
OpenTUI no-flicker gate success
Lint & Static (ubuntu-latest, Node 22.x) success

åģ同äļ€ head äļŠåŪ‰čĢ…éŠŒæ”ķ及å…ķ四åđģ台分发įŸĐé˜ĩįĄŪåŪžčĒŦ PR 之äŧķč·ģčŋ‡ïžŒæšį  TUI äļĪæĄč…ŋäļŽåŋ…需 check äŋæŒįŧŋ。åΜé—īč·Ŋåū„schedule č·ģčŋ‡åˆ†įąŧå™ĻäļŽæšį  TUIã€åŠč·‘ installed-npm + äūčĩ–åŪƒįš„įŸĐé˜ĩïž‰į”ą scripts/tests/e2e-workflow.test.js įš„æ–°æ–­čĻ€å›šåŪšïžŒæ— æģ•į”Ļ PR 之äŧķį›īæŽĨåŪžæĩ‹ —— čŊĨč·Ŋåū„č́合å…Ĩéŧ˜čŪĪ分æ”Ŋ后才䞚按 cron č§Ķ发。

äļé€‚į”ĻéĄđ无䚧品 UI / TUI æ”đåŠĻ故无戊å›ūïž›æœŠč°ƒåšĶᜟåŪžå››åđģ台åΜé—īčŋčĄŒïžˆčŪūčŪĄæ–‡æĄĢå·ēčŪ°å―•čŊĨå–čˆïž‰ã€‚

@yiliang114

Copy link
Copy Markdown
Collaborator Author

head æ›īæ–°åŽįš„åĪéŠŒïžˆb3bc3ee932ba4merge main @ 9acb3a5a1d68a

äļŠäĄčŊæŪč·‘åœĻ 43dcb55802b20合åđķ main 后分æ”Ŋ tip 前čŋ›åˆ° b3bc3ee同äļ€éš”įĶŧ worktree åŋŦčŋ›åˆ°æ–° tip é‡č·‘ïžŒįŧ“čŪšäļå˜ïžš

éĄđ å‘―äŧĪ įŧ“æžœ
workflow meta-tests npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/e2e-workflow.test.js scripts/tests/main-ci-failure-issue-workflow.test.js exit 0 — 2 files / 226 tests passed73.39s
åŪ‰čĢ…éŠŒæ”ķé—Ļ新 tip YAML grep -n "event_name == 'schedule'" .github/workflows/tui-parity.yml L250 installed-npm.if = schedule || workflow_dispatch
分发įŸĐé˜ĩäūčĩ– grep -n "needs: 'installed-npm'" L303äŧäļšæˆåŠŸäūčĩ–朊æ”ūåŪ―

PR 之äŧķįš„č·ģčŋ‡čĄŒäļšäļŽäļŠéĒé‚ĢæĄčŊ„čŪšäļ€č‡ī朎č―Ūįš„ workflow_dispatch åŪžéŠŒčŋčĄŒč§ #40623408739įŧ“æžœäžšå•į‹Žå›žåļ–。

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Manual-dispatch experiment on this PR head (b3bc3ee932ba404aa7272caa61ec125a14eafda9): run 40623408739.

Job Result
Installed npm Node26 private Bun acceptance (producer) success
Installed npm global and npx — linux-x64 success, 12/12 Node22 + 12/12 Node26
Installed npm global and npx — linux-arm64 success, 12/12 + 12/12
Installed npm global and npx — darwin-arm64 success, 12/12 + 12/12
Installed npm global and npx — darwin-x64 success, 12/12 + 12/12
TUI parity snapshots (ink vs opentui) success
OpenTUI no-flicker gate success

Two points worth recording:

  • The darwin-x64 leg — the lane whose per-PR queueing cost motivated this PR — passed all 24 cases under the current budgets. The previously flaky global-ignore-scripts native case passed at 64.1s (Node22) / 45.8s (Node26).
  • This run took ~4h wall-clock (10:51 → 14:52 Asia/Shanghai) with the macOS legs queueing ~1.7–2.4h each on GitHub-hosted runners. One green run does not re-prove the cause of the earlier exit-wait timeout, but it does reproduce the queueing cost this PR removes from PR updates.

No product or test-budget changes were made; this is observation-only evidence for the scheduling change.

@qwen-code-dev-bot qwen-code-dev-bot 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.

Final gate review at head b3bc3ee (re-read immediately before submitting).

  • No prior formal reviews or unresolved threads on this PR.
  • Required CI per the repository ruleset (Lint & Static (ubuntu-latest, Node 22.x)): COMPLETED/SUCCESS at this head; only the non-required review-pr lane was still queued at submission time.
  • Independent check found no Critical:
    • Producer gating is airtight: installed-npm runs only on schedule/workflow_dispatch; installed-distribution has a bare needs: installed-npm with no if: override, so a skipped or failed producer skips the four consumers — no distribution run can start without the canonical artifact.
    • The added github.event_name != 'schedule' terms on changes/parity/noflicker are exactly what keeps the fail-closed classifier semantics intact on PR events (a skipped classifier still runs the lanes via needs.changes.result != 'success') while nightly runs execute only the installed suite.
    • Concurrency keeps cancel-in-progress scoped to pull_request, and schedule runs fall to the run-ID group, so PR churn cannot cancel nightly evidence.
    • The failure reporter admits only tui-parity schedule failures on main (plus the pre-existing push branch); the new meta-test matrix pins success/cancelled/skipped/feature-branch/PR/manual-dispatch as non-filing, and the it.each extension covers the schedule file-issue route.
    • The size baseline bump matches the workflow growth; design docs (bilingual pair) document the tradeoff, including that nightly coverage no longer gates merges and high-risk changes need a manual dispatch.

@qqqys qqqys 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.

Approving at b3bc3ee932ba404aa7272caa61ec125a14eafda9.

This moves the installed-npm acceptance producer out of the PR path and onto a nightly, and wires nightly failures into the existing issue reporter. The scheduling change has one configuration that nothing in CI can exercise before merge, so that is where I spent the review.

The schedule path is unverifiable by observation here, and it is the one that could silently do nothing. The author's dispatch run (40623408739) proves workflow_dispatch works — all seven jobs green — but on a dispatch changes still runs, because its new guard is github.event_name != 'schedule'. On a nightly tick changes is skipped, which is a different graph, and a producer that depended on it would be skipped too. So I read the job graph at this head rather than extrapolating from the dispatch:

  • installed-npm (line 248-251) carries if: "${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}" and no needs: at all. It is therefore reachable on a schedule tick with changes skipped. This is the load-bearing property of the whole change.
  • installed-distribution (line 301-304) keeps needs: 'installed-npm' with no custom if, so the default success() applies: it runs only after the producer succeeds, and on pull_request — where the producer's if is false and the job is skipped — the matrix is skipped with it. That is the intended removal of per-PR cost, not an accidental one, and the failure path is still correct: a red producer does not distribute.
  • parity and noflicker both keep needs: 'changes' and gained github.event_name != 'schedule' inside their existing !cancelled() && (...) expression, so a nightly tick runs only the acceptance chain and leaves the source-built TUI lanes alone.

The new test pins exactly the invariant that matters: expect(job.needs).toBeUndefined(), alongside the precise trigger set (['pull_request','schedule','workflow_dispatch']), the literal cron and changes.if. A future edit that hangs installed-npm off changes would go red instead of quietly emptying the nightly.

The cron arithmetic checks out. 17 19 * * * is 19:17 UTC, which is 03:17 the next day in Asia/Shanghai — matching the comment above it — and the :17 minute does avoid the top-of-hour hosted burst as claimed.

The failure reporter will actually fire on the workflow name it lists. main-ci-failure-issue.yml adds 'tui-parity' both to on.workflow_run.workflows and to the schedule branch's contains(fromJSON('[...]'), github.event.workflow.name) allow-list. That match is by exact string, so I confirmed the producer workflow declares name: 'tui-parity' at line 1 of tui-parity.yml. A mismatch here would have been silent — the nightly would run and fail with no issue ever filed, which is the precise downside of moving a gate out of the PR path.

The test changes extend coverage rather than relax it. The updated if pins are still exact-string toBe assertions, not loosened matchers. The truth table gains eight rows that are mostly negative controls: tui-parity on schedule/main files only for failure, and is explicitly false for success, cancelled, skipped, for a feature branch, and for pull_request and workflow_dispatch events. The one rewritten case became it.each(['workflow_dispatch', 'schedule']) with its three assertions unchanged, so schedule gained coverage instead of dispatch losing it.

On the size ratchet, since the baseline moved and the numbers do not line up exactly: .size-baseline records 22589 tui-parity.yml while the file at this head is 22694 bytes. That is not a violation. check-workflow-size.sh fails only when size > base + GROWTH_ALLOWANCE (4096), i.e. above 26685, and warns on banked slack only when size + 20000 < base; 22694 trips neither. The 105-byte excess is main-side drift folded in by the merge commit, and the script's own file_matches_base logic exists to keep that from red-walling unrelated PRs. Lint & Static, which runs the shell gate, passed at this head.

On the history: the PR has no Review records and no inline threads, so there is no earlier blocking finding to re-verify. @wenshao's round was filed against the first commit 03257a00 with C=0, S=1; the single Suggestion — that the new nightly was not yet wired into Main CI Failure Issue — is what the second commit 43dcb558 implements, and it was non-blocking in any case. That round's verdict predates the merge from main, which is why I re-read the graph at b3bc3ee9 instead of carrying it forward; the merged content is what Test (ubuntu-latest, Node 22.x) validated when it passed in 39m21s, since those workflow tests compare the pinned strings against the real file.

On CI: zero failing checks at this head. Test (ubuntu-latest, Node 22.x), Lint & Static, Integration Tests (no-AK, No Sandbox), web-shell E2E Smoke, and tui-parity's own three jobs — Check TUI impact, TUI parity snapshots, OpenTUI no-flicker gate — all passed, the last three because a PR event resolves the workflow from the PR's own branch. review-pr is still pending and does not gate this.

What this approval does not carry: no actual scheduled run has executed, since the cron only exists after merge. The nightly path is verified statically against the job graph and by the pinned tests, not by an observed tick, so the first 03:17 run is worth a glance to confirm the acceptance chain starts with changes skipped. The tradeoff itself — an installed-npm regression now surfaces up to a day later instead of on the PR — is a deliberate, documented decision recorded in both design files, not a defect.

@chiga0 chiga0 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.

Scope: CI workflow YAML only (.github/workflows/tui-parity.yml, main-ci-failure-issue.yml), test updates, design docs, size baseline. No product source changed. Tier: Scan.

No blocking findings.
Approval blockers: none.

Checked:

  • Workflow name field: tui-parity.yml declares name: 'tui-parity' — matches the string added to main-ci-failure-issue.yml's workflow_run.workflows list. ✓
  • installed-npm guard: if: "${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}" — PR updates skip it as stated. ✓
  • changes job guard: if: "${{ github.event_name != 'schedule' }}" — skipped on nightly runs, runs on PR and manual dispatch. ✓
  • parity/noflicker guards: both add github.event_name != 'schedule' to the existing condition — skipped on nightly. ✓
  • installed-distribution still needs: 'installed-npm' with no independent trigger — it will be skipped whenever installed-npm is skipped (PR updates). ✓
  • Concurrency group: keyed on github.event_name, so PR runs and nightly runs occupy separate groups and cannot cancel each other. cancel-in-progress only fires for pull_request. ✓
  • Failure reporter: tui-parity schedule failures on main branch now enter the issue route; PR and workflow_dispatch paths not included (condition requires schedule event for tui-parity). ✓
  • Size baseline updated from 22223 → 22589 (366-byte increase consistent with the diff). ✓
  • Tests in e2e-workflow.test.js and main-ci-failure-issue-workflow.test.js pin all new scheduling conditions and failure-reporter rows. ✓

Not covered (deliberately inapplicable): no persisted format change → contract-asymmetry class not applicable; no auth/credential change; no product runtime behavior changed → execution rungs not run.

Cross-check: qwen-code-dev-bot approved at head b3bc3ee; wenshao reviewed an older head (03257a0) with C=0 S=1 and no blockers; no findings from either that contradict or extend this review.

Reviewed with AI assistance.

@qwen-code-review-bot

Copy link
Copy Markdown
Collaborator

Released in v0.26.3.

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.

6 participants