Files
zed/corgi.toml
T
Anthony Eid 04d586b80e gpui: Make ForegroundJournal aware of sleep and window visibility (#64269)
## Summary

Keep foreground-work measurements and per-window presentation
expectations valid across observed sleep/wake and visibility changes.
Simplified after review to about 530 changed lines including tests and
configuration.

## Scope

- Keep all measurement state in the foreground-local journal writer. Use
`PowerState` and `PowerTransition`; no new locks, counters, or changes
to the ring protocol.
- Work that started at or before the last power transition (or while
suspended) is dropped when it completes: task polls before small-poll
folding, and actions, inputs, draws, and presents through the same
`power_interrupted_since(start)` check. No per-activity state is added;
every measurement already carries its start time.
- Track visibility and pending frames together per window. Hiding or
sleeping clears the presentation expectation; on recovery
`Window::refresh_visibility` re-records it from the window's actual
dirty state, so the journal never guesses. Old latency associations
remain invalid.
- Repeated notifications for the same power state are ignored, so a
duplicate wake does not invalidate in-flight work.
- The journal subscribes to GPUI's existing power notifications and
rechecks native window visibility after wake. App only registers these
subscriptions (two initialization lines).
- Keep the existing one-second pending-frame deadline and
foreground-turn sealing behavior. No watchdog, recurring timer, test-app
exceptions, unfinished-hang detection, start/end ring notices, or
reader-side deduplication.
- Remove lifecycle counters. Keep measurement version 2 on reports and a
valid dirty-to-present sample count for weighting averages.

## Telemetry

- `Hang Incidents` gains `report_window_seconds` and stall percentiles
over every incident in the window (`stall_p50_ms`, `stall_p95_ms`,
`stall_max_ms`, from an `hdrhistogram`), so stall distributions no
longer depend on the censored `incidents[]` list. Reports are now sent
even when no incident occurred, so summing `report_window_seconds` gives
observed running time for incident rates.
- `Frame Duration Report` gains dirty-to-present percentiles
(`dirty_to_present_p50_ms`, `dirty_to_present_p95_ms`,
`dirty_to_present_max_ms`) alongside the existing average, and
`average_present_interval_ms` (mean frame-to-frame interval while
animating, a proxy for the display's refresh interval when normalizing
dirty-to-present).

Detection remains completion-based. This does not solve hangs that never
return or force an interval to seal when no further foreground events
arrive. Existing legacy hang logs/trace triggers are unchanged. Late or
coalesced platform notifications remain a coverage limitation.

## Validation

- `corgi test -p gpui --features profiler --lib`: **392 tests passed**.
- Focused lifecycle/wake tests also passed a 20-seed run.
- The extension-suggestion regression that failed on all three CI
platforms now passes locally after removal of the
watchdog/test-construction changes.
- `corgi check -p gpui` and `corgi check -p zed -p input_latency_ui`
passed.
- Formatting and `git diff --check` passed.
- Corgi configuration includes only the three existing GPUI image/font
fixtures needed to run its tests.

Native platform sleep/wake testing and review remain outstanding. The
README review marker remains for the human author to remove manually
after review.

Release Notes:

- Improved the accuracy of hang and frame-latency telemetry around
sleep, wake, and hidden windows.
- [GPUI] Added a `PowerTransition` interval boundary and
`measurement_version` to profiler hang reports.
2026-09-16 16:00:19 +00:00

97 lines
4.5 KiB
TOML

corgi_version = "0.1.43"
# corgi build configuration for Zed.
# Corgi source and documentation: https://github.com/ConradIrwin/corgi
#
# corgi runs build.rs scripts and proc-macros in a sandbox with no network,
# no ambient environment, and reads limited to each package's own source plus
# what is declared here. Every setting names the packages it applies to, so
# only those packages' actions key on it — comment or command-text edits
# rebuild nothing.
#
# See the top-level Cargo.toml `[patch.crates-io]` for the local `scratch` patch
# that lets cxx/webrtc-sys build under the sandbox, and `util::fs_embed!` for
# how dev builds read embedded assets from the checkout instead of baking the
# build path into the binary.
# sha256-pinned tools, fetched into the corgi store and exposed to the named
# packages' build scripts via the given environment variable. URLs and hashes
# are for the macOS arm64 build host.
#
# Note: no protoc tool is needed. `proto` and `livekit_api` compile their
# protobufs with `protox` (a pure-Rust protoc) and `prost_build::compile_fds`,
# so nothing shells out to a protoc binary.
[tools.cmake]
version = "4.1.2"
url = "https://github.com/Kitware/CMake/releases/download/v4.1.2/cmake-4.1.2-macos-universal.tar.gz"
sha256 = "3be85f5b999e327b1ac7d804cbc9acd767059e9f603c42ec2765f6ab68fbd367"
bin = "cmake-4.1.2-macos-universal/CMake.app/Contents/bin/cmake"
env = "CMAKE"
packages = ["webrtc-sys", "wasmtime-c-api-impl"]
# Prebuilt libwebrtc, so webrtc-sys-build does not have to download it over the
# network (which the sandbox forbids). The tag must match WEBRTC_TAG in the
# pinned livekit-rust-sdks revision; webrtc-sys-build reads LK_CUSTOM_WEBRTC and
# skips the download when it is set.
[tools.webrtc-prebuilt]
version = "0001d84-4"
url = "https://github.com/zed-industries/livekit-rust-sdks/releases/download/webrtc-0001d84-4/webrtc-mac-arm64-release.zip"
sha256 = "09ba71bfbc15c6aacced7fe20451a9648dfe648c24295f28d75fc386dbd7281a"
path = "mac-arm64-release"
env = "LK_CUSTOM_WEBRTC"
packages = ["webrtc-sys"]
# Plan-time probe: the git SHA is read here (outside the sandbox) and frozen
# into the keyed value. zed/build.rs prefers $ZED_COMMIT_SHA over running git,
# which the sandbox blocks. Release-only; dev builds embed no SHA (the source
# reads it via option_env!). cli/remote_server build.rs run git directly rather
# than reading this var, so they are not listed here.
[env.ZED_COMMIT_SHA]
command = "git rev-parse HEAD"
packages = ["zed"]
profiles = ["release"]
# Reads a package's actions perform that corgi's sandbox does not grant by
# default. By default only a package's own `.rs` files (plus its manifest) are
# readable, so non-`.rs` files a build script or macro reads must be listed even
# when they live inside the package. Entries are glob patterns relative to the
# named package's root, and every file they match is granted and hashed as an
# input. A pattern selects files, never directories: `dir/**` is how you take
# everything under a directory, and `dir/*` takes only what sits directly in it.
[extra-inputs]
# Own non-.rs files read at build time (protobufs, bindgen headers, doc/data).
proto = ["proto/**"]
livekit_api = ["vendored/protocol/**"]
media = ["src/bindings.h"]
gpui = [
"README.md",
"examples/image/exif-orientation-rotate-180.jpg",
"../../assets/fonts/ibm-plex-sans/IBMPlexSans-Regular.ttf",
"../../assets/fonts/lilex/Lilex-Regular.ttf",
]
git = ["src/checkpoint.gitignore"]
git_ui = ["src/commit_message_prompt.txt"]
editor = ["../grammars/src/**"]
edit_prediction = ["license_patterns/**"]
agent_skills = ["builtin/**"]
agent_settings = ["src/prompts/**"]
json_schema_store = ["src/schemas/**"]
prettier = ["src/prettier_server.js"]
zed = ["resources/**"]
zed_extension_api = ["wit/**"]
gpui_wgpu = ["src/*.wgsl"]
# Cross-package reads (and, for gpui_apple, its own metal shader source).
extension_host = ["../extension_api/wit/**"]
# cbindgen reads the renderer source directly from build.rs to generate shader bindings.
gpui_apple = ["../gpui/src/**", "src/metal_renderer.rs", "src/shaders.metal"]
eval_cli = ["../zed/Cargo.toml"]
prompt_store = ["../git_ui/src/commit_message_prompt.txt"]
release_channel = ["../zed/RELEASE_CHANNEL"]
cli = ["../../script/uninstall.sh"]
remote_server = ["../zed/Cargo.toml"]
# `../zed/Cargo.toml`: build.rs reads it for ZED_PKG_VERSION. `../grammars/src`
# and `src/prompts` are embedded in release builds; dev builds read them at
# runtime via fs_embed.
edit_prediction_cli = ["../zed/Cargo.toml", "../grammars/src/**", "src/prompts/**"]