Skip to content

ci(pr-risk): publish the advisory grade as a neutral Check Run - #15442

Open
mattmillerai wants to merge 8 commits into
ci/bump-pr-riskfrom
matt/be-8038-pr-risk-check-run
Open

ci(pr-risk): publish the advisory grade as a neutral Check Run#15442
mattmillerai wants to merge 8 commits into
ci/bump-pr-riskfrom
matt/be-8038-pr-risk-check-run

Conversation

@mattmillerai

@mattmillerai mattmillerai commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

STACKED — merging lands on ci/bump-pr-risk (owned by @cloud-code-bot, #15379), NOT main.

Summary

Opt the PR risk grader into publishing its verdict as a neutral PR risk (advisory) Check Run, so a graded PR carries a commit-attached record of the tier and the per-axis reasoning behind it — not just the mutable risk:* label. One input, no pin change.

Changes

  • What: check_run: true in the with: block of the pr-risk job, plus the file-header sentence describing what the caller emits and a comment block recording the three limits of the artifact (see Limits).
  • Breaking: none. The published check's conclusion is hardcoded neutral upstream and the publish step always exits 0, so it cannot fail a PR even if a repo later marks it required.

Why this is stacked instead of based on main

check_run does not exist on the pin main currently carries (e4a8f7c, 2026-08-04) — that revision of the reusable workflow has no check_run input and no publish-check job at all. Adding check_run: true on top of it would be an undefined with: input, which GitHub rejects at workflow startup, i.e. every PR would lose its grade entirely rather than gain a check. So this is based on #15379, which moves the pin to a revision where the input exists — 6178233 when this branch opened, and f8eec04 after #15379 rebased onto a newer upstream SHA. The input is declared at both.

Per the source request I did not bump the pin myself; #15379 owns that. When it moved 6178233f8eec04, this branch took the base's pin verbatim in the merge and kept only the check_run: true opt-in as its own diff.

It is already working on this PR

pull_request runs the caller from the merge ref, so this branch's own CI exercised check_run: true and published the check. This is the direct evidence that the input exists at the base pin and that the opt-in does what it claims:

$ gh api repos/Comfy-Org/ComfyUI_frontend/commits/1f7b816832.../check-runs
{"id": 96281900642, "name": "PR risk (advisory)", "status": "completed",
 "conclusion": "neutral", "output_title": "Risk: R3"}

A neutral conclusion renders as skipping in gh pr checks, which is why it does not read as a new check in the rollup.

Limits

Recorded in the workflow comment rather than left implicit, because each one was raised in review and each is real. All three are upstream-owned; a one-line caller opt-in cannot reach any of them.

  • Absence, not conclusion, is the failure mode. The job's if: skips fork and Dependabot PRs, and upstream's publish-check gates on the kill switch (needs.gate.outputs.enabled == 'true') even for a manual dispatch, while grade deliberately does not. So a dispatched re-grade with RISK_CONFIG {"enabled": false} still rewrites the label and publishes nothing — the dispute/backfill path is exactly the one that can produce no record. Never mark PR risk (advisory) required in branch protection: the skipped PRs would block forever on a check that is never created.
  • Not one per commit. The publisher only ever POSTs to /check-runs; it never looks up or updates an existing run of the same name. Every re-grade of the same head sha (reopen, ready_for_review after opened, a re-run, a dispatch) appends another check, so a commit can carry several with differing tiers and nothing marking which is current. The check is also commit-scoped while the grade is PR-scoped, so two PRs sharing a head sha get indistinguishable checks. Read the newest; the run log stays the tiebreak.
  • It perturbs the next grade of the same sha. An existing check makes checks_state non-null, so the grader's 120s "checks have not registered yet" grace window stops applying to a re-grade, which can settle a poll early and floor the reversibility axis. Bounded to re-grades of the same sha (a fresh push has no prior check on its commit), and advisory throughout.

Review Focus

  • Permissions: unchanged. checks: write is already in the caller's block — every caller on this pin owes that grant whether or not it opts in, because GitHub validates the nested publish-check job's declared permissions at startup regardless of its if:. Verified the caller block is a superset of the union of all three upstream jobs at the current pin f8eec04 (gate {}; grade contents:read/issues:write/pull-requests:write/checks:read/actions:read/statuses:read; publish-check checks:write/contents:read/pull-requests:read).
  • No tier feedback loop. The published check is neutral, and the grader's rollup ladder is FAILURE → PENDING → SUCCESS → NEUTRAL → null; a neutral context can only turn a null rollup into NEUTRAL, and the reversibility axis tests $checks == null or $checks != "SUCCESS", which treats those two identically. So a re-grade of the same head SHA cannot grade worse on that axis because of the check this PR causes to be published. The check is not self-excluded (self-exclusion keys on checkSuite.workflowRun.databaseId and a REST-created check run has no workflowRun), which is what makes the third limit above bite — the tier is unaffected by the ladder, but the timing of the poll loop is not.
  • Rebase hazard: the base branch is bot-owned. If the caller-bump fleet force-pushes ci/bump-pr-risk onto a newer upstream SHA, this branch needs a rebase onto the new base before it can merge.
  • check_name is left at its upstream default, PR risk (advisory).

Verification

Workflow-only diff, no src/ touched, so the Vitest/Playwright suites are not implicated and were not run — that is stated rather than papered over.

  • actionlint .github/workflows/ci-pr-risk.yml → 0 findings.
  • YAML parse of the caller: with resolves to workflows_ref, enabled, pr_number, pr_numbers, check_run: true; the uses: ref and workflows_ref are the identical 40-hex SHA f8eec04e7923f4719d5b7dbc342e5c15580e22ba (the lock-step pin contract the reusable workflow enforces).
  • Input existence checked against the reusable workflow source at all three pins: absent at main's e4a8f7c, declared type: boolean, default: false at 6178233, and still declared at the current base pin f8eec04.
  • End-to-end: the neutral check published on this PR's own head commit (above).
  • Each documented limit read out of the pinned source — publish-check's if: and its POST-only publish loop in pr-risk.yml, the empty_deadline/settled_once poll loop in scripts/pr-risk/grade-targets.sh.

What this does not do

  • It does not backfill. Check Runs attach to a commit, and this only publishes on grades that happen after it merges. 175 of the 747 currently-open PRs in this repo already carry a risk:* label; none has an advisory Check Run, and none gains one retroactively — each picks one up on its next push, reopen, or ready-for-review event. A manual workflow_dispatch with pr_numbers is the backfill lever (subject to the kill-switch limit above).
  • Unexercised artifact: the source request cites an upstream investigation (39 PRs whose CI label exceeded an offline regrade) recorded in a tracker I have no access to. I could not read it, so I neither confirmed nor relied on that count; nothing in this diff depends on it.

Provenance

  • Authored by: agent-work loop
  • Verified: actionlint on the changed workflow: 0 findings; YAML parse confirming check_run: true and identical uses:/workflows_ref pins; upstream input-existence check at three pins (absent at main's e4a8f7c, present at 6178233 and at the current base pin f8eec04); end-to-end confirmation that the neutral PR risk (advisory) check (Risk: R3) published on this PR's own head commit; each documented limit read out of the pinned upstream source (publish-check's if: and POST-only publish loop; the empty_deadline/settled_once poll loop in grade-targets.sh). After merging the rebased base, every one of those claims was re-read against f8eec04 rather than carried forward on trust — check_run/check_name still declared; publish-check still needs.gate.outputs.enabled == 'true' && inputs.check_run with no workflow_dispatch escape while grade keeps one; the publish step still POST-only with a hardcoded neutral; grade-targets.sh still empty_deadline=$(date +%s) + 120; the caller permissions block still a superset of the upstream union. actionlint re-run clean on the merged file. Repo test suites not run — no src/ change.
  • Deviations: stacked on ci: bump pr-risk to github-workflows@762c92f #15379 rather than opened against main, because the input does not exist at main's current pin (see above). All six review findings were adjudicated against the pinned upstream source: the High severity one (undefined input → startup failure) is refuted by the check this PR already published; the other five are confirmed but upstream-owned and unfixable from a caller, so they are recorded as comments at the opt-in site instead of being coded around. No follow-up tickets filed — each is advisory-only and belongs to Comfy-Org/github-workflows, not this repo. The base branch was later force-pushed onto a newer upstream SHA (the "rebase hazard" this body called out), which conflicted this branch on the pin lines; resolved by taking the base's f8eec04 and keeping this branch's check_run: true and comment block, so the diff against the base is unchanged in substance.

cloud-code-bot Bot and others added 2 commits August 17, 2026 23:11
The `risk:*` label is mutable and carries no history, so a grade that is
later disputed cannot be checked against the reasoning that produced it.
Opting into the grader's `check_run` input publishes the tier and the
per-axis reason table as a commit-attached Check Run.

The upstream conclusion is hardcoded `neutral` and the publish step always
exits 0, so nothing here can fail a PR. `checks: write` is already granted
in this caller — every caller on this pin owes that grant whether or not it
opts in, because GitHub validates the nested `publish-check` job's
declaration at startup regardless of its `if:`.
@mattmillerai mattmillerai added the agent-coded Opened by the agent-work code loop label Aug 20, 2026
@mattmillerai
mattmillerai marked this pull request as ready for review August 20, 2026 01:18
@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 50f4950c-8ecb-4630-89c2-5c921c378116

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Aug 20, 2026
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

🎭 Playwright: ✅ 2006 passed, 0 failed

📊 Browser Reports
  • chromium: View Report (✅ 1985 / ❌ 0 / ⚠️ 0 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 76.5 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.8 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.0 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.3 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.3 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 15ms TBT · 87.3 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 1ms TBT · 70.7 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 1ms TBT · 72.0 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.0 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 83.8 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.2 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.7 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 141ms TBT · 79.2 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 10ms TBT · 75.9 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 168.5 MB heap
vue-large-graph-pan: · 56.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 78ms TBT · 157.9 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.7 MB heap

ℹ️ No baseline found — significance unavailable.

Absolute values
Metric Value
canvas-idle: avg frame time 17ms
canvas-idle: p95 frame time 17ms
canvas-idle: layout duration 0ms
canvas-idle: style recalc duration 6ms
canvas-idle: layout count 0
canvas-idle: style recalc count 6
canvas-idle: task duration 532ms
canvas-idle: script duration 11ms
canvas-idle: TBT 0ms
canvas-idle: heap used 76.5 MB
canvas-idle: DOM nodes -284
canvas-idle: event listeners -170
canvas-mouse-sweep: avg frame time 17ms
canvas-mouse-sweep: p95 frame time 17ms
canvas-mouse-sweep: layout duration 4ms
canvas-mouse-sweep: style recalc duration 43ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 78
canvas-mouse-sweep: task duration 1377ms
canvas-mouse-sweep: script duration 182ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 56.8 MB
canvas-mouse-sweep: DOM nodes -280
canvas-mouse-sweep: event listeners -186
canvas-zoom-sweep: avg frame time 17ms
canvas-zoom-sweep: p95 frame time 17ms
canvas-zoom-sweep: layout duration 1ms
canvas-zoom-sweep: style recalc duration 19ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 32
canvas-zoom-sweep: task duration 416ms
canvas-zoom-sweep: script duration 15ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 70.0 MB
canvas-zoom-sweep: DOM nodes 77
canvas-zoom-sweep: event listeners 20
dom-widget-clipping: avg frame time 17ms
dom-widget-clipping: p95 frame time 17ms
dom-widget-clipping: layout duration 0ms
dom-widget-clipping: style recalc duration 6ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 9
dom-widget-clipping: task duration 442ms
dom-widget-clipping: script duration 33ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 59.3 MB
dom-widget-clipping: DOM nodes 14
dom-widget-clipping: event listeners 2
large-graph-idle: avg frame time 17ms
large-graph-idle: p95 frame time 17ms
large-graph-idle: layout duration 0ms
large-graph-idle: style recalc duration 4ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 4
large-graph-idle: task duration 634ms
large-graph-idle: script duration 48ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 68.3 MB
large-graph-idle: DOM nodes -277
large-graph-idle: event listeners -168
large-graph-pan: avg frame time 17ms
large-graph-pan: p95 frame time 17ms
large-graph-pan: layout duration 0ms
large-graph-pan: style recalc duration 11ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 65
large-graph-pan: task duration 2813ms
large-graph-pan: script duration 1005ms
large-graph-pan: TBT 15ms
large-graph-pan: heap used 87.3 MB
large-graph-pan: DOM nodes -281
large-graph-pan: event listeners -166
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 8ms
large-graph-zoom: style recalc duration 12ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 66
large-graph-zoom: task duration 2738ms
large-graph-zoom: script duration 926ms
large-graph-zoom: TBT 1ms
large-graph-zoom: heap used 70.7 MB
large-graph-zoom: DOM nodes -250
large-graph-zoom: event listeners -164
legacy-node-drag: avg frame time 17ms
legacy-node-drag: p95 frame time 17ms
legacy-node-drag: layout duration 0ms
legacy-node-drag: style recalc duration 5ms
legacy-node-drag: layout count 0
legacy-node-drag: style recalc count 41
legacy-node-drag: task duration 2181ms
legacy-node-drag: script duration 224ms
legacy-node-drag: TBT 1ms
legacy-node-drag: heap used 72.0 MB
legacy-node-drag: DOM nodes -144
legacy-node-drag: event listeners 94
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 4ms
minimap-idle: layout count 0
minimap-idle: style recalc count 4
minimap-idle: task duration 667ms
minimap-idle: script duration 47ms
minimap-idle: TBT 0ms
minimap-idle: heap used 69.0 MB
minimap-idle: DOM nodes -279
minimap-idle: event listeners -168
subgraph-dom-widget-clipping: avg frame time 17ms
subgraph-dom-widget-clipping: p95 frame time 17ms
subgraph-dom-widget-clipping: layout duration 0ms
subgraph-dom-widget-clipping: style recalc duration 9ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 45
subgraph-dom-widget-clipping: task duration 536ms
subgraph-dom-widget-clipping: script duration 140ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 83.8 MB
subgraph-dom-widget-clipping: DOM nodes 15
subgraph-dom-widget-clipping: event listeners 8
subgraph-idle: avg frame time 17ms
subgraph-idle: p95 frame time 17ms
subgraph-idle: layout duration 0ms
subgraph-idle: style recalc duration 8ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 8
subgraph-idle: task duration 526ms
subgraph-idle: script duration 9ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 66.2 MB
subgraph-idle: DOM nodes -297
subgraph-idle: event listeners -231
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 5ms
subgraph-mouse-sweep: style recalc duration 41ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 78
subgraph-mouse-sweep: task duration 1184ms
subgraph-mouse-sweep: script duration 125ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 67.7 MB
subgraph-mouse-sweep: DOM nodes -296
subgraph-mouse-sweep: event listeners -216
subgraph-transition-enter: avg frame time 17ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 15ms
subgraph-transition-enter: style recalc duration 33ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 19
subgraph-transition-enter: task duration 1014ms
subgraph-transition-enter: script duration 33ms
subgraph-transition-enter: TBT 141ms
subgraph-transition-enter: heap used 79.2 MB
subgraph-transition-enter: DOM nodes 13671
subgraph-transition-enter: event listeners 2383
viewport-pan-sweep: avg frame time 17ms
viewport-pan-sweep: p95 frame time 17ms
viewport-pan-sweep: layout duration 0ms
viewport-pan-sweep: style recalc duration 36ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 245
viewport-pan-sweep: task duration 9862ms
viewport-pan-sweep: script duration 3412ms
viewport-pan-sweep: TBT 10ms
viewport-pan-sweep: heap used 75.9 MB
viewport-pan-sweep: DOM nodes -283
viewport-pan-sweep: event listeners -157
vue-large-graph-idle: avg frame time 18ms
vue-large-graph-idle: p95 frame time 17ms
vue-large-graph-idle: layout duration 0ms
vue-large-graph-idle: style recalc duration 0ms
vue-large-graph-idle: layout count 0
vue-large-graph-idle: style recalc count 0
vue-large-graph-idle: task duration 17461ms
vue-large-graph-idle: script duration 367ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 168.5 MB
vue-large-graph-idle: DOM nodes -6548
vue-large-graph-idle: event listeners -7474
vue-large-graph-pan: avg frame time 18ms
vue-large-graph-pan: p95 frame time 17ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 21ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 175
vue-large-graph-pan: task duration 21660ms
vue-large-graph-pan: script duration 948ms
vue-large-graph-pan: TBT 78ms
vue-large-graph-pan: heap used 157.9 MB
vue-large-graph-pan: DOM nodes -6548
vue-large-graph-pan: event listeners -7469
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 23ms
workflow-execution: layout count 3
workflow-execution: style recalc count 16
workflow-execution: task duration 139ms
workflow-execution: script duration 8ms
workflow-execution: TBT 0ms
workflow-execution: heap used 68.7 MB
workflow-execution: DOM nodes 135
workflow-execution: event listeners 98
Raw data
{
  "timestamp": "2026-08-25T22:28:58.724Z",
  "gitSha": "8ce728127629a9de3c7f55ba85c8693e727c55cf",
  "branch": "matt/be-8038-pr-risk-check-run",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2055.770999999993,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 7.084999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 532.282,
      "heapDeltaBytes": 11893412,
      "heapUsedBytes": 80833344,
      "domNodes": -280,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 10.304,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2015.67399999999,
      "styleRecalcs": 5,
      "styleRecalcDurationMs": 4.997999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 531.161,
      "heapDeltaBytes": 10452448,
      "heapUsedBytes": 79503916,
      "domNodes": -287,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 10.722999999999999,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2437.049000000002,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 43.254,
      "layouts": 12,
      "layoutDurationMs": 3.8679999999999994,
      "taskDurationMs": 1463.692,
      "heapDeltaBytes": -8345628,
      "heapUsedBytes": 61366740,
      "domNodes": -278,
      "jsHeapTotalBytes": 6283264,
      "scriptDurationMs": 196.73200000000003,
      "eventListeners": -187,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2238.028999999983,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 42.821999999999996,
      "layouts": 12,
      "layoutDurationMs": 3.392,
      "taskDurationMs": 1289.951,
      "heapDeltaBytes": -5333892,
      "heapUsedBytes": 57759256,
      "domNodes": -282,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 168.228,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1739.847999999995,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 18.026999999999997,
      "layouts": 6,
      "layoutDurationMs": 0.579,
      "taskDurationMs": 409.46999999999997,
      "heapDeltaBytes": 4300032,
      "heapUsedBytes": 73366480,
      "domNodes": 76,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 15.091000000000003,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1739.4330000000764,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 19.415999999999997,
      "layouts": 6,
      "layoutDurationMs": 0.6609999999999999,
      "taskDurationMs": 422.46400000000006,
      "heapDeltaBytes": 4310168,
      "heapUsedBytes": 73397772,
      "domNodes": 77,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 14.378,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 734.8810000000299,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.140999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 435.811,
      "heapDeltaBytes": -6741416,
      "heapUsedBytes": 62253820,
      "domNodes": 14,
      "jsHeapTotalBytes": 6029312,
      "scriptDurationMs": 32.821999999999996,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 719.5150000000012,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.1049999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 447.37200000000007,
      "heapDeltaBytes": -6765352,
      "heapUsedBytes": 62138664,
      "domNodes": 14,
      "jsHeapTotalBytes": 6029312,
      "scriptDurationMs": 33.082,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2073.336999999981,
      "styleRecalcs": 5,
      "styleRecalcDurationMs": 4.718999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 631.6529999999999,
      "heapDeltaBytes": -20871708,
      "heapUsedBytes": 69755452,
      "domNodes": -279,
      "jsHeapTotalBytes": 4186112,
      "scriptDurationMs": 45.571,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2031.2020000000075,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 3.119,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 635.84,
      "heapDeltaBytes": -17182460,
      "heapUsedBytes": 73503596,
      "domNodes": -274,
      "jsHeapTotalBytes": -1843200,
      "scriptDurationMs": 50.495999999999995,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3470.6639999999993,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.350999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2790.717,
      "heapDeltaBytes": 13964792,
      "heapUsedBytes": 98280044,
      "domNodes": -283,
      "jsHeapTotalBytes": 4636672,
      "scriptDurationMs": 1011.108,
      "eventListeners": -181,
      "totalBlockingTimeMs": 29,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3562.475000000063,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 10.251,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2834.3369999999995,
      "heapDeltaBytes": -6914432,
      "heapUsedBytes": 84764920,
      "domNodes": -279,
      "jsHeapTotalBytes": -569344,
      "scriptDurationMs": 999.2670000000002,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4546.895000000006,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.760000000000003,
      "layouts": 60,
      "layoutDurationMs": 7.512,
      "taskDurationMs": 2720.289,
      "heapDeltaBytes": 7527096,
      "heapUsedBytes": 80009500,
      "domNodes": -265,
      "jsHeapTotalBytes": -1880064,
      "scriptDurationMs": 937.4290000000001,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4566.350000000057,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.93,
      "layouts": 60,
      "layoutDurationMs": 7.635,
      "taskDurationMs": 2755.781,
      "heapDeltaBytes": -27823912,
      "heapUsedBytes": 68306060,
      "domNodes": -234,
      "jsHeapTotalBytes": 1826816,
      "scriptDurationMs": 913.5790000000001,
      "eventListeners": -147,
      "totalBlockingTimeMs": 2,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3225.9409999999775,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.169,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2153.5769999999998,
      "heapDeltaBytes": -1918500,
      "heapUsedBytes": 70353216,
      "domNodes": -287,
      "jsHeapTotalBytes": -307200,
      "scriptDurationMs": 223.17,
      "eventListeners": -1,
      "totalBlockingTimeMs": 1,
      "frameDurationMs": 16.666666666666636,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3253.6569999999756,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 4.812,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2208.087,
      "heapDeltaBytes": 12692008,
      "heapUsedBytes": 80604680,
      "domNodes": 0,
      "jsHeapTotalBytes": 1728512,
      "scriptDurationMs": 224.909,
      "eventListeners": 188,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2074.391999999989,
      "styleRecalcs": 4,
      "styleRecalcDurationMs": 4.161999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 679.8319999999999,
      "heapDeltaBytes": -20957944,
      "heapUsedBytes": 71543252,
      "domNodes": -279,
      "jsHeapTotalBytes": 3137536,
      "scriptDurationMs": 46.235,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2052.6270000000295,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 3.228999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 654.033,
      "heapDeltaBytes": -18684196,
      "heapUsedBytes": 73231304,
      "domNodes": -278,
      "jsHeapTotalBytes": -794624,
      "scriptDurationMs": 48.232000000000006,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 737.6760000000218,
      "styleRecalcs": 44,
      "styleRecalcDurationMs": 9.406,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 530.617,
      "heapDeltaBytes": 18276968,
      "heapUsedBytes": 87906992,
      "domNodes": 14,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 140.951,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 770.6380000000763,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 9.233000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 540.5550000000001,
      "heapDeltaBytes": 18215640,
      "heapUsedBytes": 87836116,
      "domNodes": 16,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 138.66600000000003,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2029.6480000000088,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.877000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 519.905,
      "heapDeltaBytes": -628812,
      "heapUsedBytes": 69091148,
      "domNodes": -296,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 8.827,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2011.406000000079,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.9159999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 531.146,
      "heapDeltaBytes": 342588,
      "heapUsedBytes": 69727848,
      "domNodes": -297,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 9.732999999999999,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1956.6059999999652,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 44.163000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.963,
      "taskDurationMs": 1209.268,
      "heapDeltaBytes": 6849308,
      "heapUsedBytes": 76569948,
      "domNodes": -297,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 128.366,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1882.5560000000223,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 38.376999999999995,
      "layouts": 16,
      "layoutDurationMs": 4.742,
      "taskDurationMs": 1159.261,
      "heapDeltaBytes": -4324080,
      "heapUsedBytes": 65464648,
      "domNodes": -295,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 121.29100000000001,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1401.4930000000732,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 33.137,
      "layouts": 14,
      "layoutDurationMs": 15.276000000000002,
      "taskDurationMs": 1014.3969999999998,
      "heapDeltaBytes": -7556960,
      "heapUsedBytes": 83068688,
      "domNodes": 13671,
      "jsHeapTotalBytes": 11010048,
      "scriptDurationMs": 33.42400000000001,
      "eventListeners": 2383,
      "totalBlockingTimeMs": 141,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12601.600999999959,
      "styleRecalcs": 245,
      "styleRecalcDurationMs": 36.552,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9711.132,
      "heapDeltaBytes": -23049016,
      "heapUsedBytes": 67652116,
      "domNodes": -282,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 3348.129,
      "eventListeners": -157,
      "totalBlockingTimeMs": 20,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 13175.092000000062,
      "styleRecalcs": 245,
      "styleRecalcDurationMs": 36.098,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10013.537999999999,
      "heapDeltaBytes": 7669232,
      "heapUsedBytes": 91439588,
      "domNodes": -283,
      "jsHeapTotalBytes": 4341760,
      "scriptDurationMs": 3475.276,
      "eventListeners": -157,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18173.598000000027,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17232.589,
      "heapDeltaBytes": -34855172,
      "heapUsedBytes": 176591988,
      "domNodes": -6548,
      "jsHeapTotalBytes": -5115904,
      "scriptDurationMs": 359.4870000000001,
      "eventListeners": -7475,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18448.28699999994,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17690.170000000002,
      "heapDeltaBytes": -35243412,
      "heapUsedBytes": 176726264,
      "domNodes": -6548,
      "jsHeapTotalBytes": -3321856,
      "scriptDurationMs": 373.824,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21935.65700000005,
      "styleRecalcs": 178,
      "styleRecalcDurationMs": 21.836000000000023,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 21537.601,
      "heapDeltaBytes": -44290708,
      "heapUsedBytes": 165566676,
      "domNodes": -6548,
      "jsHeapTotalBytes": -4362240,
      "scriptDurationMs": 945.852,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 129,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 22095.169000000056,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 20.540999999999976,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 21782.141,
      "heapDeltaBytes": -38924080,
      "heapUsedBytes": 165535460,
      "domNodes": -6548,
      "jsHeapTotalBytes": -798720,
      "scriptDurationMs": 949.77,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 27,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 505.56399999993573,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 23.613000000000003,
      "layouts": 3,
      "layoutDurationMs": 1.4429999999999998,
      "taskDurationMs": 151.11100000000002,
      "heapDeltaBytes": 5812924,
      "heapUsedBytes": 71956296,
      "domNodes": 148,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 9.105,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 473.7609999999677,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 22.830000000000002,
      "layouts": 3,
      "layoutDurationMs": 0.811,
      "taskDurationMs": 125.913,
      "heapDeltaBytes": 5481248,
      "heapUsedBytes": 72046004,
      "domNodes": 121,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 7.4209999999999985,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@github-actions github-actions Bot added the risk:R3 PR risk grade (advisory shadow check; grader-owned) label Aug 20, 2026
@mattmillerai mattmillerai added the cursor-review Trigger multi-model Cursor agent review on this PR label Aug 20, 2026
@codecov

codecov Bot commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@                 Coverage Diff                 @@
##           ci/bump-pr-risk   #15442      +/-   ##
===================================================
- Coverage            82.53%   82.53%   -0.01%     
===================================================
  Files                 1934     1934              
  Lines               110810   110810              
  Branches             32329    33295     +966     
===================================================
- Hits                 91462    91460       -2     
- Misses               19018    19020       +2     
  Partials               330      330              
Flag Coverage Δ
e2e 66.74% <ø> (ø)
unit 74.66% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.
see 4 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Cursor Review — Consolidated panel

Triggered by @mattmillerai.

Found 6 finding(s).

Severity Count
🟠 High 1
🟡 Medium 1
🟢 Low 3
⚪ Nit 1

Panel: 8/8 reviewers contributed findings.

Comment thread .github/workflows/ci-pr-risk.yml
Comment thread .github/workflows/ci-pr-risk.yml
Comment thread .github/workflows/ci-pr-risk.yml
Comment thread .github/workflows/ci-pr-risk.yml Outdated
Comment thread .github/workflows/ci-pr-risk.yml
Comment thread .github/workflows/ci-pr-risk.yml Outdated
mattmillerai and others added 2 commits August 19, 2026 22:48
Review found the opt-in comment overclaimed in three ways, each verified
against the reusable workflow at the pinned SHA:

- "can never fail a PR" holds for the hardcoded neutral conclusion but not
  for absence. The job's if: skips fork and Dependabot PRs, and upstream's
  publish-check gates on the kill switch even on a manual dispatch while the
  grade job deliberately does not, so a dispatched re-grade with the switch
  off relabels and publishes nothing. Marking the check required would block
  those PRs forever.

- "the immutable record" reads as one per commit. Upstream only POSTs to
  /check-runs and never updates, so every re-grade of the same head sha
  appends another check; a commit can carry several with differing tiers.
  Commit-scoping also means two PRs on one sha get indistinguishable checks.

- Publishing perturbs the next grade of the same sha: an existing check makes
  the rollup non-empty, so the grader's 120s not-yet-registered grace window
  stops applying to a re-grade, which can settle a poll early and floor the
  reversibility axis.

Comment-only; the check_run: true opt-in is unchanged.
mattmillerai and others added 2 commits August 20, 2026 06:33
Conflict was the pin only: the base rebased and moved the caller from
github-workflows 6178233 to f8eec04, while this branch still carried the
older pin under its `check_run: true` opt-in. Took the base's newer pin
(f8eec04, 2026-08-20 > 6178233, 2026-08-17) and kept this branch's
`check_run: true` plus the three-limits comment block, which sits outside
the conflicted hunk.

Re-verified every claim that block makes against pr-risk.yml at f8eec04
rather than carrying them forward on trust:
- `check_run` and `check_name` are still declared inputs.
- `publish-check` gates on `needs.gate.outputs.enabled == 'true' &&
  inputs.check_run`, with no workflow_dispatch escape — while `grade` adds
  `|| github.event_name == 'workflow_dispatch'`. The "a dispatched re-grade
  under the kill switch relabels but publishes nothing" asymmetry holds.
- The publish step is `gh api -X POST .../check-runs` with no update path
  and a hardcoded `conclusion: neutral`, so "appends, never revises" and
  "can never fail a PR" both still hold.
- grade-targets.sh still sets `empty_deadline=$(date +%s) + 120` for the
  "checks have not registered yet" window, so the perturbs-the-next-grade
  note keeps its number.
- The caller permissions block still covers the union upstream declares
  across gate/grade/publish-check (contents:read, issues:write,
  pull-requests:write, checks:write, actions:read, statuses:read).
…38-pr-risk-check-run

# Conflicts:
#	.github/workflows/ci-pr-risk.yml
Conflict was the pin only: the base moved the caller from
github-workflows eaee6df to 762c92f, while this branch still carried
the older pin under its `check_run: true` opt-in. Took the base's
newer pin (762c92f, 2026-08-25 > eaee6df, 2026-08-21) and kept this
branch's `check_run: true` plus the three-limits comment block, which
sits outside the conflicted hunk.

Re-verified against pr-risk.yml at 762c92f rather than carrying
forward on trust: `check_run`/`check_name` are still declared inputs
and the `publish-check` job (gated on
`needs.gate.outputs.enabled == 'true' && inputs.check_run`) still
exists at this pin.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent-coded Opened by the agent-work code loop cursor-review Trigger multi-model Cursor agent review on this PR risk:R3 PR risk grade (advisory shadow check; grader-owned) size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants