We accumulate data about PR lifecycle times for PRs in the google/xls repository. The data includes key timestamps such as when a PR is created, when a review is requested (with CI passing), when the "reviewing internally" label is applied, and when the PR is finally closed (either merged or manually closed).
Three Python scripts are used in this project:
- accumulate_pr_data.py: Fetches PRs from github.com/google/xls, processes timeline events, and writes the relevant data to pr_data.csv.
- plot_pr_delays.py: Reads pr_data.csv, filters for PRs from xlsynth/xlsynth, calculates delays between lifecycle events, and produces a matplotlib boxplot which is saved as pr_delays.png.
- plot_pr_counts.py: Reads pr_data.csv, filters for PRs from xlsynth/xlsynth, counts the number of PRs opened each month, and produces a bar chart saved as pr_counts.png.
To generate the report:
-
Set your GITHUB_TOKEN environment variable.
-
Run:
python update_all.py
The following diagram shows the typical PR delays for PRs originating from the xlsynth/xlsynth repository:
And here is the monthly count of those PRs:
Below is a list of all pull-requests that originated from xlsynth/xlsynth, grouped by the month in which they were opened. The list is regenerated automatically by generate_pr_links_table.py.
Turn semantics for open non-draft PRs (🚧): 👉 means "Google's turn" (i.e. to review or land), and 👋 means "our turn".
Determination precedence is:
- If unresolved Googler feedback exists, it is not Google's turn.
- Feedback is considered addressed if a thread is explicitly resolved or the PR author leaves a reviewer-visible follow-up after the feedback (e.g. reply/comment, review request, ready-for-review).
- Commits and force-pushes alone do not count as reviewer-visible follow-up.
- Otherwise, latest relevant actor wins (Googler actor => not Google's turn; non-Googler actor => Google's turn).
- Actor side is determined by xlsynth-org membership: users in
xlsynthare considered non-Googler side; users not inxlsynthare considered Googler side. This heuristic does not preclude Googlers from also being inxlsynth; those overlap cases need an explicit override list.
🧪 = draft (open) 🚧 = still open (not merged yet) 👉 = Google's turn 👋 = our turn

