fix(report): keep multiline live titles on one terminal row
Multiline test titles left stale terminal fragments after repaint because the live window erased fewer rows than the title occupied.
- Display CR/LF as spaces in each live row; keep the original title in saved reports.
- Add regression coverage, a patch changeset, and document the display behavior.
Verified
Ran it locally: yes.
Reproduce from a scratch project using the built runner linked as e2e. Save this as e2e.config.ts:
import { defineEngine } from 'e2e/engine';
export default { workers: 1, targets: [{ name: 'headless', platform: 'test',
engine: defineEngine({ name: 'noop', version: '1', spiVersion: 1 }) }] };
Save this as tests/title.e2e.ts:
import { test } from 'e2e';
test('First\nSecond', async () => {
await new Promise(resolve => setTimeout(resolve, 800));
});
Run the actual built CLI in a terminal (validation used a 40×100 PTY):
node node_modules/e2e/dist/cli/bin.js run title.e2e.ts --config e2e.config.ts
| Behavior | Main | Branch |
|---|---|---|
Live title First\nSecond | Two physical display rows; erase counts one | First Second occupies one row |
| Saved structured title | Original newline retained | Original newline retained |
Actual ANSI-stripped live-paint excerpts:
Main:
└── First
Second 0ms
Branch:
└── First Second 0ms
Node 24.18.0: the two focused regressions fail on main; all 17 focused tests pass with the fix. Runner build, typecheck, and 2,543 unit tests pass (one skipped), using two workers.
Also ran the existing reporter stress suite against the local testbed with installed Chrome, a fresh temporary profile, and the public CDP connector: node node_modules/e2e/dist/cli/bin.js run --config .campaign-stress.config.ts. The unchanged fixture produces its expected seven failures (including one timeout), six passes (including one flaky result), and two skips; exit 1 is intentional. No provider calls or logged-in browser profile were used.
Repository-wide pnpm check has identical pre-existing fallow findings on main and this branch. pnpm test stops before tests at the untouched mobile package build because this filtered runner/testbed install lacks its dependencies; those gates are not reported as passing.
CI follow-up at a2af1ac6fc022b64b9db507d6fc6ae8a28fd6012:
Transplanted the already merged upstream #934 fix: parse and validate the actual positive remaining download wait budget, capped at500ms, rather than assume the message always says500ms. Full web-platform integration:40 tests passed on each branch; core/web builds and focused lint pass. Controls reject invalid budgets, too-early trigger timing and malformed messages.
This addresses a shared baseline test defect without changing production behavior or adding expected-failure exemptions. GitHub CI on the updated head remains the final platform check.