LearnNewsExamplesServices
Frontmatter
id16150
titleHeaded E2E default drops required frame-rate override
stateClosed
labels
bugdeveloper-experienceaitestingregression
assigneesneo-gpt-emmy
createdAtJul 30, 2026, 12:33 AM
updatedAtJul 30, 2026, 1:00 AM
githubUrlhttps://github.com/neomjs/neo/issues/16150
authorneo-gpt-emmy
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 30, 2026, 1:00 AM

Headed E2E default drops required frame-rate override

Closed Backlog/active-chunk-10 bugdeveloper-experienceaitestingregression
neo-gpt-emmy
neo-gpt-emmy commented on Jul 30, 2026, 12:33 AM

Context

PR #16138 resolved #16128 by making PRESENTING_LAUNCH_ARGS the unconditional headed-E2E default. At dev head be17257b3f, that profile is defined by filtering --disable-frame-rate-limit out of BASE_LAUNCH_ARGS; only exact NEO_E2E_ENGINE_PROFILE=1 restores the flag.

Post-merge physical evidence on the active macOS Workstation seat reverses that ticket's premise: ordinary/default launches opened multiple real Chrome windows whose semantic app state stayed live while the visible windows were completely empty. The controlled rerun with --disable-frame-rate-limit present rendered application content. The operator identified animated OffscreenCanvas work as a likely contributor; that mechanism remains a hypothesis and is not required to repair the launch contract.

This is new evidence after the predecessor resolved, so it needs a successor rather than reopening #16128.

Live latest-open sweep: checked the 30 newest open issues plus the 50 most recent A2A messages at 2026-07-29T22:32:47Z; no equivalent ticket or in-flight claim exists.

The Problem

The launcher now encodes the wrong baseline for UI tests:

standard E2E command
→ activeLaunchArgs() with no sentinel
→ PRESENTING_LAUNCH_ARGS
→ BASE_LAUNCH_ARGS without --disable-frame-rate-limit
→ physically empty native windows on the current seat

An empty-window profile is not a valid UI-test profile. Worker, DOM, and Neural Link assertions can remain green while the visual subject does not exist, producing a semantically plausible false-green receipt.

This must not be a flag peers remember, a sentinel they select, or a host-specific command copied between sessions. The standard E2E configuration must include the required launch baseline automatically. Specialized profiles may add benchmark or GPU-intent flags; no UI-test profile may remove the flag required to render content.

The Architectural Reality

  • test/playwright/e2e/utils/gpuIntent.mjs is the single launch-argument authority. Its current default removes the required flag.
  • test/playwright/playwright.config.e2e.mjs passes activeLaunchArgs() to both gl-probe and the Chromium project, so the selector owns the physical browser process rather than documentation alone.
  • NEO_E2E_ENGINE_PROFILE=1 selects additional GPU-intent/benchmark flags. That distinction may remain useful, but it must not decide whether application pixels exist.
  • NEO_FILM_TAKE=1 is a pacing/recording signal in Workstation specs. It must not carry browser-correctness responsibility.
  • The earlier #15912 / #16128 evidence described a historical host/harness observation. The new post-merge physical receipt proves that it cannot remain an unqualified universal launch contract.
  • No product-side docking class owns this problem. The repair belongs in the E2E launch authority and its focused selector tests.

The Fix

  1. Make --disable-frame-rate-limit an unconditional member of the shared UI-test browser baseline.
  2. Make the no-sentinel/default activeLaunchArgs() result inherit that baseline.
  3. Make every retained UI-test variant—including film and engine/benchmark selection—inherit the same baseline. A specialized variant may add flags, but it must not remove --disable-frame-rate-limit.
  4. Remove the flag-less PRESENTING_LAUNCH_ARGS UI profile. If a future non-UI experiment needs a flag-less browser, it belongs behind a separate explicitly non-visual harness contract, never the E2E UI default.
  5. Keep film pacing/recording semantics independent of browser launch correctness.
  6. Update launcher JSDoc and affected comments so the ordinary command is the whole user contract; peers should not need to know this flag exists.
  7. Pin the selector with focused tests and retain an exact-head headed Workstation screenshot showing populated application pixels under the ordinary no-sentinel command.

Contract Ledger

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
Shared UI launch baseline test/playwright/e2e/utils/gpuIntent.mjs Always contains --disable-frame-rate-limit None; empty windows invalidate UI evidence Owner JSDoc Exported-list unit matrix
activeLaunchArgs() default gpuIntent.mjs Returns the shared flag-bearing baseline with no sentinel None Owner JSDoc + config comments Unset-env assertion + headed populated frame
NEO_E2E_ENGINE_PROFILE gpuIntent.mjs:isEngineProfile() May add GPU-intent/benchmark flags; never gates the rendering flag Default baseline Owner JSDoc Exact-sentinel matrix
Film selection Workstation specs + gpuIntent.mjs Controls recording/pacing only; still inherits the rendering flag Ordinary test shape Existing spec JSDoc Film-only selector assertion
Former PRESENTING_LAUNCH_ARGS gpuIntent.mjs Removed as a flag-less UI profile Shared UI baseline Owner JSDoc Absence assertion

Acceptance Criteria

  • With all E2E profile sentinels unset, activeLaunchArgs() contains --disable-frame-rate-limit.
  • Every exported launch list consumed by the E2E UI configuration contains --disable-frame-rate-limit.
  • Film-only, engine-only, false-like, arbitrary, and ordinary selector values all retain --disable-frame-rate-limit; profile selection can only add or otherwise tune flags.
  • No UI-test command, spec, or peer workflow needs to set NEO_E2E_ENGINE_PROFILE merely to obtain rendered content.
  • Both the GL probe and Chromium project consume the same corrected default list.
  • An exact-head headed Workstation witness launched with the standard no-sentinel command passes and retains a populated application frame; semantic-only green is insufficient.
  • No touched JSDoc, runner example, or test comment instructs peers to remember the flag or calls a flag-less path the safe/default presenting profile.
  • The PR records the superseded evidence boundary: historical #15912 / #16128 host observations do not override the current physical receipt.

Out of Scope

  • Product-side QT docking fixes or visual taxonomy work from #15955.
  • Diagnosing the likely animated-OffscreenCanvas mechanism before restoring the safe default.
  • Film editing or capture choreography.
  • Reopening resolved #16128 or #15912.
  • Proving a universal Chromium rule across every host; this ticket repairs the repository UI-test contract from current physical evidence.
  • Running another known-invalid flag-less headed window merely to reproduce emptiness again.

Avoided Traps

  • Documentation-only reminder: rejected; the ordinary command must already be correct.
  • Engine-profile workaround: rejected as the UI contract; peers should not need to know or remember the flag.
  • Semantic assertion as visual proof: rejected; this failure class keeps worker truth green behind empty windows.
  • Flag-less “presenting” variant: rejected for UI tests; a profile with nothing to present cannot establish UI evidence.
  • Bundling with a docking product ticket: rejected; launch authority is independently owned and one-PR-resolvable.
  • Reopening the predecessor: rejected; the regression is post-merge successor evidence.

Related

Successor to #16128 and PR #16138.

Related: #15912, #15955.

Decision Record impact: none.

Origin Session ID: 019fac4d-7844-7422-9486-7f73ccf308f5

Retrieval Hint: "post-16138 default drops disable-frame-rate-limit empty headed Workstation windows"