CEF accelerated first-presentation startup trace

Dumber records this cold-start timeline only for the accelerated CEF → DMABUF → GTK path. It is not a backend-neutral startup metric: the WebKit backend does not add milestones to this trace and never emits this CEF summary.

For a selected CEF GUI process, Dumber captures neutral process_entry and config_complete timestamps, then activates and seeds this CEF-owned trace only after configuration selects CEF. CEF helper processes, WebKit GUI startup, the standalone omnibox, and CLI commands never initialize this trace, record its milestones, or emit its summary. A selected CEF GUI trace accepts these one-shot milestones only in order:

  1. process_entry
  2. config_complete
  3. cef_library_load_begin (immediately before InitWithApp)
  4. cef_initialized
  5. browser_create_requested
  6. first_accelerated_paint_received
  7. first_dmabuf_texture_swap (after GtkPicture.SetPaintable succeeds)
  8. first_gtk_presentation (the subsequent GTK frame-clock after-paint)

The CEF-to-GTK bridge owns the native accelerated-paint, DMABUF texture-swap, and GTK presentation boundaries. Dumber records the bridge's ordered callbacks; it does not synthesize them for another engine or rendering path. CEF library-load completion is intentionally not recorded: InitWithApp is an opaque operation. Duplicate, unknown, and out-of-order transitions are rejected. At the last milestone Dumber emits exactly one normal-level JSON summary (startup_trace: first presentation) with the selected CEF render backend, an incomplete_reason, total milliseconds, and monotonic milestones.

A non-DMABUF CEF backend or a missing accelerated callback does not produce a complete summary and is not comparable with this measurement. In particular, WebKit startup must be measured with a separately defined WebKit-specific contract rather than this CEF trace.

Reproducible collection

Build the candidate, then run:

DUMBER_FIRST_PRESENTATION_BIN="$PWD/dist/dumber" \
DUMBER_MACHINE_GPU_PROFILE=integrated-gpu \
  scripts/collect_first_presentation.sh

The collector is for the accelerated CEF/DMABUF/GTK contract above. By default each collection is a fresh directory below $XDG_STATE_HOME/dumber/roadmap-evidence (or $HOME/.local/state/dumber/roadmap-evidence when XDG_STATE_HOME is unset), not in the repository. DUMBER_FIRST_PRESENTATION_OUTPUT may override it only with a new absolute directory below an existing non-symlink parent. The collector never clears or reuses a caller-supplied path.

The script requires the current display and the CEF 147 runtime at ~/.local/share/cef-147-runtime (override with DUMBER_CEF_DIR). It performs exactly five bounded launches with fresh XDG homes and CEF root cache, fixes the DMABUF/Vulkan renderer, and writes exactly metadata.json, run-01.json through run-05.json, and baseline.json. Metadata includes only coarse, comparison-safe OS/architecture, display protocol, and machine/GPU profile labels. Set DUMBER_MACHINE_GPU_PROFILE to one of generic-gpu, integrated-gpu, discrete-gpu, hybrid-gpu, virtual-gpu, or unknown-gpu; do not use a device model or other identifier. Publish only the seven reviewed JSON files to an external Gist. Raw logs and temporary XDG homes are removed and must not be published. metadata.json derives the selected github.com/bnema/purego-cef2gtk pseudo-version and its full immutable Git origin hash from Go module metadata; branch selectors or missing origin metadata fail collection. A missing or incomplete timeline, non-DMABUF backend, or invalid run also fails collection.