chore(repo): add PR stats and ages to weekly issue report - #36851
Merged
Conversation
The weekly Slack report now carries a second table with pull request data per scope label (open, created / merged / closed since the last report, average and p95 age of open PRs), and the issue table gains average and p95 age columns. Both tables start with Everything and Unscoped rows, which were missing before. PRs come from the same issues endpoints the scraper already paginates; they were being filtered out. Merged / closed PRs are re-checked against merged_at / closed_at because the endpoint's `since` filters on updated_at. The message is now one Slack section block per table chunk to stay under the 3000 character block limit, with the table header repeated in continuation chunks. Scope rows with no activity in a table are omitted, a missing previous value renders no delta instead of a delta from zero, and the footer links to the nx package health page on npm-burst.
✅ Deploy Preview for nx-docs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for nx-dev ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Contributor
|
View your CI Pipeline Execution ↗ for commit 3b7f6b2
☁️ Nx Cloud last updated this comment at |
The formatter now returns a structured report that renders two ways: Slack sections for the webhook payload, and plain markdown that is written to GITHUB_STEP_SUMMARY (and printed to the log). The summary gets real headings, links and tables instead of fenced text. Slack rendering gains a bold title, a bold label above each table, and a top-level `text` fallback so notifications show the report title.
… dry run The Slack message now uses a header block for the title, a context block for the notes, one section per unlabeled-items link (the encoded label filters run over 1500 characters each, so two in one section breaks the 3000 character limit), a divider before each table, and a context block for the footer link. workflow_dispatch gets a dry_run input, on by default, that skips the Slack message and the cached-data upload. A manual run would otherwise overwrite the artifact the next scheduled run diffs against, moving its "since" window to the day of the test. The job summary is still written.
skip_slack and skip_cache_upload replace dry_run, both on by default. A manual run can then upload the new-shape cache to set the baseline for the new columns without posting to Slack.
…orkflow The step was lookup-only and nothing read its result, so it never restored anything. Its post step still saved on every miss: globbing `**/node_modules` across the pnpm checkout took over four hours before a 14 minute tar of a 943 MB archive that the cache quota evicted before the next run. setup-node already caches the pnpm store.
jaysoo
approved these changes
Aug 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Current Behavior
The weekly report only covers issues. There is no PR data, no age data, and no row for everything or for unscoped items. It only goes to Slack, as one section block.
The job also runs for 4 to 6 hours after the message is sent. The
Cache node_modulesstep is lookup-only and nothing reads it, but its post step still saves on every miss: globbing**/node_modulesover the pnpm checkout takes over four hours, then it tars a 943 MB archive that the cache quota evicts before the next run. The last three scheduled runs were cancelled at the job limit.Expected Behavior
Issues get avg / p95 age columns. PRs get their own table: open, created / merged / closed since the last report, avg / p95 age. Both tables start with
EverythingandUnscopedrows. Scope rows with no activity in a table are dropped, a missing previous value shows no delta instead of(+total), and the footer links to the nx package health page on npm-burst.The same report is written to the workflow's job summary as real markdown (headings, tables, links), so there is a readable copy outside Slack.
PRs come from the same issues endpoints we already paginate, we were filtering them out. In Slack the title is a header block, the notes and the footer are context blocks, and each table sits under a bold label in its own section blocks to stay under the 3000 character limit. The payload passes
blocks.validate.The cache step is gone;
setup-nodealready caches the pnpm store and the install takes under a minute. The job should finish in about 90 seconds.workflow_dispatchgets two inputs, both on by default:skip_slackandskip_cache_upload. A manual run neither pings the channel nor moves the window the next scheduled run diffs against unless you untick one. Unticking onlyskip_cache_uploaduploads the new-shape cache and sets the baseline for the new columns quietly. The job summary is always written, so that is where to look at a test run.Output from a run against live data, with last week's cache, as it prints to the log:
The big negative deltas on the closed / created / merged columns are an artifact of that run: the "previous" report was a cold run over the whole of July and August. In steady state both windows are a week.
Related Issue(s)
Fixes #