fix(engine,producer): drive forceScreenshot from one authoritative local

Miguel R4 blocker on #2359: my R3 fix at renderOrchestrator only updated
the observability copy, leaving the authoritative captureForceScreenshot
local at compileResult.forceScreenshot (false for auto→software). The
frameCapture side clamped its own local and correctly routed screenshot,
but downstream orchestrator code overwrote observability back to
beginframe from the still-false local at two sites:

  - Parallel-stream label at renderOrchestrator.ts:2293 mis-labelled the
    stream as 'beginframe' when actual capture was 'screenshot'.
  - capture_strategy telemetry at renderOrchestrator.ts:2440-2450
    overwrote the earlier observability correction, so the final
    captureMode observation flipped back to 'beginframe' while the
    engine actually captured screenshot.

Fix: extract the clamp into a caller-facing helper
applyConcreteGpuScreenshotClamp(current, resolvedGpuMode, cfg) that
returns the (possibly-promoted) new boolean. Callers assign it back to
their authoritative local, so routing + telemetry + strategy code read
one value.

Changes:

  - packages/engine/src/config.ts: new exported
    applyConcreteGpuScreenshotClamp; delegates to
    shouldClampToScreenshotForConcreteGpu but computes the caller's
    final value, not just the clamp decision. Reads the programmatic
    opt-out from cfg.forceScreenshotExplicitlyOptedOut. Idempotent on
    already-true input.
  - packages/engine/src/index.ts: export the new helper.
  - packages/engine/src/services/frameCapture.ts: replace the inline
    OR expression with applyConcreteGpuScreenshotClamp.
  - packages/producer/src/services/renderOrchestrator.ts: assign result
    into the AUTHORITATIVE captureForceScreenshot local (was updating
    only observability). Downstream parallel-stream label at :2293 and
    capture_strategy telemetry at :2440-2450 now read the corrected
    value.

Tests: 6 new caller-level cases for applyConcreteGpuScreenshotClamp
covering the exact matrix Miguel called out:

  - resolved software + default false → promotes to true (screenshot)
  - resolved software + programmatic opt-out → stays false (BeginFrame)
  - resolved hardware + default false → stays false
  - resolved software + already-true → stays true (idempotent)
  - resolved software + env PRODUCER_FORCE_SCREENSHOT=false → stays false
  - resolved software + undefined cfg → promotes to true (frameCapture path)

Local: 67/67 engine config tests pass (was 61). oxfmt clean.
This commit is contained in:
Vance Ingalls
2026-07-14 03:17:29 +00:00
parent 72daac2a1d
commit f44bc3a525
5 changed files with 131 additions and 31 deletions
+28
View File
@@ -661,3 +661,31 @@ export function shouldClampToScreenshotForConcreteGpu(
if (opts.programmaticOptOut) return false;
return env["PRODUCER_FORCE_SCREENSHOT"] !== "false";
}
/**
* Caller-facing pair to `shouldClampToScreenshotForConcreteGpu`: computes the
* value the *authoritative* `forceScreenshot` local should hold after the
* concrete-resolved-GPU decision fires. Returns the (possibly-promoted) new
* boolean, so the caller can assign it back to its local — driving both
* routing AND telemetry from one source of truth.
*
* Reads the programmatic opt-out from `cfg.forceScreenshotExplicitlyOptedOut`
* (set by `resolveConfig` when EITHER env `PRODUCER_FORCE_SCREENSHOT=false`
* OR programmatic `overrides.forceScreenshot === false` was present).
*
* Idempotent: `applyConcreteGpuScreenshotClamp(true, ...)` returns `true`
* without consulting anything else.
*/
export function applyConcreteGpuScreenshotClamp(
currentForceScreenshot: boolean,
resolvedGpuMode: "software" | "hardware",
cfg: Pick<EngineConfig, "forceScreenshotExplicitlyOptedOut"> | undefined,
env: NodeJS.ProcessEnv = process.env,
): boolean {
return (
currentForceScreenshot ||
shouldClampToScreenshotForConcreteGpu(resolvedGpuMode, currentForceScreenshot, env, {
programmaticOptOut: cfg?.forceScreenshotExplicitlyOptedOut ?? false,
})
);
}