diff --git a/apps/electron-backend-e2e/src/performance/journey-renderer-probe.spec.ts b/apps/electron-backend-e2e/src/performance/journey-renderer-probe.spec.ts index 7dcc107d3..c5559d871 100644 --- a/apps/electron-backend-e2e/src/performance/journey-renderer-probe.spec.ts +++ b/apps/electron-backend-e2e/src/performance/journey-renderer-probe.spec.ts @@ -378,6 +378,26 @@ test('rejects a probe that was installed after the document started', async () = ); }); +test('rejects a probe whose performance observers were unavailable instead of reporting zeros', async () => { + const fixture = createFixture(); + const state = fixture.rawState() as { + capabilities: { layoutShift: boolean; longTask: boolean }; + }; + state.capabilities.longTask = false; + renderFirstCard(fixture); + await settle(); + assert.equal(fixture.state().counters.longTasks, 0); + assert.throws( + () => assertJourneyRendererProbeState(fixture.state()), + /observer-unavailable: longTask/ + ); + state.capabilities.layoutShift = false; + assert.throws( + () => assertJourneyRendererProbeState(fixture.state()), + /observer-unavailable: layoutShift, longTask/ + ); +}); + test('launch options target the workspace source cards and the shared sentinel', () => { const options = createLaunchJourneyProbeOptions(); assert.equal(options.stateKey, JOURNEY_PROBE_STATE_KEY); diff --git a/apps/electron-backend-e2e/src/performance/journey-renderer-probe.ts b/apps/electron-backend-e2e/src/performance/journey-renderer-probe.ts index a790ac665..1beef3a41 100644 --- a/apps/electron-backend-e2e/src/performance/journey-renderer-probe.ts +++ b/apps/electron-backend-e2e/src/performance/journey-renderer-probe.ts @@ -363,5 +363,16 @@ export function assertJourneyRendererProbeState( `journey-renderer-probe-sentinel-${state.sentinel.status}` ); } + // A zero from an observer that never ran is not a measurement; a build + // without these entry types must fail the iteration, never lower a + // baseline. + const missing = (['layoutShift', 'longTask'] as const).filter( + (capability) => !state.capabilities[capability] + ); + if (missing.length > 0) { + throw new Error( + `journey-renderer-probe-observer-unavailable: ${missing.join(', ')}` + ); + } return state; }