Skip resolve-targets for targeted dashboard refreshes - #168
Conversation
There was a problem hiding this comment.
Pull request overview
Routes targeted dashboard refreshes directly to the per-repository workflow, reducing webhook latency while preserving matrix resolution for backfills.
Changes:
- Bypasses
resolve-targetsfor targeted refreshes. - Moves repository configuration, PR validation, and backfill checks into the reusable workflow.
- Normalizes repository names for tokens, state processing, and cache keys.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
.github/workflows/pull-request-dashboard.yml |
Separates targeted refreshes from matrix-based backfills. |
.github/workflows/pull-request-dashboard-repo.yml |
Resolves repository configuration and validates targeted runs locally. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Pull request dashboard statusMerged · refreshed 2026-07-30 19:23 UTC Status above doesn't look right?
|
befa1fb to
84251b3
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
.github/workflows/pull-request-dashboard.yml:118
- The reusable workflow builds both its update and publish concurrency groups from the raw
inputs.repository, while its state branch and cache keys now use the normalized name. Because this call accepts bothrepoandopen-telemetry/repo, equivalent targeted dispatches can enter different concurrency groups and no longer coalesce even though they operate on the same repository state. Normalize the repository before every concurrency key, or reject the prefixed form at this boundary.
repository: ${{ inputs.repository }}
84251b3 to
c2f9629
Compare
c2f9629 to
f8c7f4c
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
.github/workflows/pull-request-dashboard.yml:112
- Targeted dispatches now bypass
Resolve trigger inputs, sotrigger_eventis no longer validated on this path. This leaves the dispatch contract in.github/scripts/pull-request-dashboard/WEBHOOK_SETUP.md:167inaccurate because it still states that the central workflow validates all documented inputs. Please update that contract to describe the targeted-path exception (or retain validation elsewhere).
if: inputs.repository != '' && inputs.pr_number != ''
f8c7f4c to
57cc760
Compare
Webhook refreshes already know their single target repository and pull request, yet every one of them pays for a separate
resolve-targetsjob whose real work takes about ten seconds. Measured on 2026-07-28, that job waited a median of 2.8 min (p90 6.1 min) just to acquire a runner, so it is a large share of end-to-end refresh latency on the highest volume path.Targeted runs now call the reusable per-repository workflow directly. To make that possible,
pull-request-dashboard-repo.ymlresolves its own entry fromrepositories.jsoninstead of receiving eight configuration values as inputs, and it also takes over the pull request number validation and the initial-backfill precondition thatresolve-targetsused to perform.resolve-targetsremains for backfills, where a matrix genuinely has to be resolved up front, and now emits only repository names.A repository is now identified by its bare
repositories.jsonname everywhere. This matters because the reusable workflow'supdate-dashboardandpublish-dashboardconcurrency groups are evaluated before any step runs, so they can only key off the raw input, while the state branch, cache keys and app token scope use the resolved entry. A second accepted spelling would place two dispatches for the same repository in different concurrency groups while both wrote the same state branch. Theopen-telemetry/-prefixed form thatresolve-targetshas accepted since #2 is therefore dropped rather than propagated: the webhook bridge splitsfull_nameand dispatches the short name, and the dispatch contract inWEBHOOK_SETUP.mdhas always specified the short name, so nothing was sending it.Verified locally that an empty input still selects all 17 configured repositories, that each configured name resolves to the same values previously passed as inputs, and that a prefixed name and an unconfigured name both fail.
One deliberate behavior change:
trigger_eventis validated only on the backfill path now, since targeted runs no longer pass throughresolve-targets. The Netlify webhook bridge already drops unknown event names before it dispatches anything, so the only remaining source of an arbitrary value is a manualworkflow_dispatch, where the value is used solely to build the concurrency group string and never reaches a shell.repositoryandpr_numberare still validated on both paths. The dispatch contract inWEBHOOK_SETUP.mdclaimed the central workflow validates every documented input, so it is updated to say which ones.