fix(ci): Take the OpenTUI interactive e2e leg out of CI (#10829)

Batch 7 added a dedicated OpenTUI leg to e2e.yml. It never ran on its own
PR — the workflow triggers only on push to main, nightly and dispatch — so
its first executions were on main, where it fails deterministically: the
same four interactive files have failed across three consecutive main
commits.

The failures are not test fragility. Each one is a parity gap the renderer
still has, and the leg did its job by surfacing them:

- the approval-mode indicator is never drawn, so a user running --yolo
  cannot see which mode they are in;
- the submit seam drops submittedPrompt, so the UserPromptSubmit hook input
  loses submitted_prompt and external-context auto-recall silently no-ops;
- the live turn bypasses the query-preparation pipeline, so @file expansion
  does not work under this renderer at all.

Removing the leg keeps main green without deleting any test: the ink leg
still runs every one of these files, so nothing regresses silently. The
renderer matrix stays wired in — the e2e legs keep pinning their renderer,
and the OpenTUI side remains runnable locally through
npm run test:integration:interactive:opentui:sandbox:none. Restoring the CI
leg is gated on closing the three gaps, tracked in #8662.

The design doc claimed the build/CI batch "runs the OpenTUI e2e leg green
on CI"; that named a mechanism this commit removes, so both mentions now
match the tree.
This commit is contained in:
ChiGao authored and GitHub committed 2026-09-02 13:01:20 +00:00
1 parent 41092ae9c3
commit c3bf0fea5b
2 files changed
+11 -70

No files matched your search

+3 -66
View File
@@ -258,7 +258,9 @@ jobs:
fi
fi
# QWEN_E2E_RENDERER=ink pins the baseline leg of the renderer
# matrix; the opentui leg runs in e2e-interactive-opentui below.
# matrix; the OpenTUI counterpart has no CI leg. Run it locally
# with npm run test:integration:interactive:opentui:sandbox:none
# (parity gaps tracked in issue #8662).
# The docker leg runs vitest directly instead of through
# test:integration:sandbox:docker: that script would rebuild the image
# the step above just built.
@@ -369,71 +371,6 @@ jobs:
OPENAI_MODEL: '${{ secrets.OPENAI_MODEL }}'
run: 'npx cross-env QWEN_E2E_RENDERER=ink VERBOSE=true KEEP_OUTPUT=true QWEN_SANDBOX=false vitest run --root ./integration-tests --exclude "**/interactive/cron-interactive.test.ts" --exclude "**/channel-plugin.test.ts" --shard="${{ matrix.shard }}"'
e2e-interactive-opentui:
name: 'E2E Interactive - OpenTUI renderer (bun)'
runs-on: 'ubuntu-latest'
# Same rationale as e2e-test-linux: a wedged run must free the runner.
timeout-minutes: 60
# Skip on fork PRs (no secrets) — see e2e-test-linux above.
if: |-
${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
steps:
- name: 'Checkout'
uses: 'actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10' # v6.0.3
- name: 'Set up Node.js'
uses: 'actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e' # v6.4.0
with:
node-version-file: '.nvmrc'
cache: 'npm'
cache-dependency-path: 'package-lock.json'
registry-url: 'https://registry.npmjs.org/'
# The opentui renderer leg runs the CLI bundle under bun: the locked
# @opentui/core loads its native renderer through bun:ffi, and the CI
# node build cannot load node:ffi. The renderer matrix also pins
# QWEN_TUI_RENDERER=opentui (plus QWEN_TUI_RENDERER_STRICT) for every
# spawned CLI, so a boot that silently fell back to ink fails the leg
# instead of passing as a false green. The version matches
# DEFAULT_BUN_VERSION in scripts/build-standalone-release.js (the
# --runtime=bun archive flavor) and is pinned, not 'latest', so an
# upstream Bun release cannot flip this gating leg red on its own.
- name: 'Set up Bun'
uses: 'oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6' # v2.2.0
with:
bun-version: '1.3.14'
- name: 'Configure npm for rate limiting'
run: |-
npm config set fetch-retry-mintimeout 20000
npm config set fetch-retry-maxtimeout 120000
npm config set fetch-retries 5
npm config set fetch-timeout 300000
- name: 'Install dependencies'
env:
QWEN_SKIP_PREPARE: '1'
run: |-
npm ci --prefer-offline --no-audit --progress=false
- name: 'Build project'
run: |-
npm run build
- name: 'Bundle CLI for E2E tests'
run: |-
npm run bundle
- name: 'Run interactive E2E tests (OpenTUI)'
env:
OPENAI_API_KEY: '${{ secrets.OPENAI_API_KEY }}'
OPENAI_BASE_URL: '${{ secrets.OPENAI_BASE_URL }}'
OPENAI_MODEL: '${{ secrets.OPENAI_MODEL }}'
KEEP_OUTPUT: 'true'
VERBOSE: 'true'
run: |-
npx cross-env QWEN_E2E_RENDERER=opentui QWEN_SANDBOX=false vitest run --root ./integration-tests interactive --exclude '**/interactive/cron-interactive.test.ts' --exclude '**/channel-plugin.test.ts'
isolated-nightly:
name: '${{ matrix.label }} (nightly)'
runs-on: 'ubuntu-latest'
@@ -159,8 +159,8 @@ The pieces, in landing order:
own (#8662 U-10). The runtime fixes this batch used to carry — the Bun
memory flags and the goal-runtime startup wait — landed early in #10128.
- **Build & CI.** Bundle asset pipeline for the OpenTUI runtime assets, the
CI legs (e2e, tui-parity), renderer-matrix integration tests, and the
parity tooling (codemod, PTY harness).
tui-parity CI gate, renderer-matrix integration tests and the env pinning
the e2e legs carry, and the parity tooling (codemod, PTY harness).
### Renderer selection and runtime gate
@@ -252,8 +252,12 @@ safe to run before its owners exist, and the activation batch inherits them:
vitest suite green; the default (ink) path byte-for-byte unchanged — the
batches landed so far touch zero reachable ink code paths because nothing
outside `src/ui/opentui/` imports them. The activation batch additionally
smoke-tests the flag under Bun (boot, dialog, live turn, exit drain); the
build/CI batch runs the OpenTUI e2e leg green on CI.
smoke-tests the flag under Bun (boot, dialog, live turn, exit drain). The
build/CI batch wired the renderer matrix into the existing e2e legs and
added the tui-parity gate; its own OpenTUI interactive e2e leg ran on
`main`, reported three real gaps (approval-mode indicator never drawn,
`@file` expansion absent, `submitted_prompt` dropped), and has since come
out of CI until those close (#8662).
- **1:1 parity audits** — screen-by-screen comparison against ink, plus a
reverse audit pass, with surviving differences landing as tracked gaps
(G-series) rather than silent drift.