Skip to content

merge-button: not found on an open PR when a required check fails (v1.0.0-beta.19) #113

Closed

Description

@Reefact

Report

Full archive, as received, on branch diagnostic/2026-10-31-merge-button (stores the report only, no fix, not meant to be merged):

  • the .zip``
  • its content: README.txt,```` report.json,````` the page skeleton`````` (2,551 lines)
report.json
{
  "extension": "v1.0.0-beta.19",
  "browser": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
  "language": "fr",
  "degradedState": null,
  "generatedAt": "2026-10-31T09:23:58.876Z",
  "entries": [
    {
      "at": "2026-10-31T09:23:50.844Z",
      "candidates": [
        "[data-testid=\"mergebox-partial\"] [data-component=\"ButtonGroup\"] button[data-variant=\"primary\"]",
        "[data-testid=\"mergebox-partial\"] button.btn-primary",
        "button[data-testid*=\"merge-button\"]",
        ".merge-message button.btn-group-merge",
        "button.js-merge-commit-button"
      ],
      "chain": "merge-button",
      "count": 1,
      "evidence": {
        "anchor": {
          "ancestors": [
            "div[data-testid=\"mergebox-border-container\"]",
            "div[data-testid=\"mergebox-partial\"]",
            "div[data-component=\"SplitPageLayout.Content\"]",
            "div[data-component=\"SplitPageLayout\"]"
          ],
          "attrs": {
            "class": "flex-self-stretch flex-shrink-0 undefined prc-ButtonGroup-ButtonGroup-vFUrY",
            "data-component": "ButtonGroup"
          },
          "tag": "div"
        },
        "facts": {
          "prState": "pullOpened",
          "release": "c4e7b7c92131"
        },
        "msSinceVisit": 2,
        "nearby": [
          {
            "ancestors": [
              "div[data-component=\"ButtonGroup\"]",
              "div[data-testid=\"mergebox-border-container\"]",
              "div[data-testid=\"mergebox-partial\"]",
              "div[data-component=\"SplitPageLayout.Content\"]"
            ],
            "attrs": {
              "aria-disabled": "false",
              "class": "prc-Button-ButtonBase-9n-Xk flex-1",
              "data-component": "Button",
              "data-variant": "default",
              "type": "button"
            },
            "tag": "button"
          }
        ],
        "trace": [
          { "candidate": "[data-testid=\"mergebox-partial\"] [data-component=\"ButtonGroup\"] button[data-variant=\"primary\"]", "steps": [1, 1, 0] },
          { "candidate": "[data-testid=\"mergebox-partial\"] button.btn-primary", "steps": [1, 0] },
          { "candidate": "button[data-testid*=\"merge-button\"]", "steps": [0] },
          { "candidate": ".merge-message button.btn-group-merge", "steps": [0, 0] },
          { "candidate": "button.js-merge-commit-button", "steps": [0] }
        ]
      },
      "firstAt": "2026-10-31T09:23:50.844Z",
      "platform": "github",
      "problem": "completion-control",
      "skeleton": "mvw7201i-4sm6c7",
      "url": "https://github.com/Reefact/first-class-errors/pull/472",
      "urls": ["https://github.com/Reefact/first-class-errors/pull/472"]
    }
  ]
}

Every candidate came back empty. The first one stops at its last step (mergebox-partial 1 → ButtonGroup 1 → button[data-variant="primary"] 0).

What the skeleton shows

The merge box, skeleton lines 1226–1232 and 1836–1850:

div data-testid="mergebox-partial" class="tmp-ml-md-6 tmp-pl-md-3 tmp-my-3"
 h2 class="sr-only"
 div class="mergePartialContainer__VUMolp position-relative partial-pull-merging-analytics-j"
  div data-testid="mergeability-icon-wrapper" class="d-none d-lg-block"
   div class="d-flex flex-justify-center flex-items-center mr-2 rounded-2 height-2"
    svg role="img" aria-label="Checks failing" data-component="Octicon" class="octicon octicon-git-merge fgColor-onEmphasis"
  div data-testid="mergebox-border-container" class="border rounded-2 borderColor-default"
   …  (sections: checks — one failing required check, two skipped, the rest successful)
   div class="bgColor-muted borderColor-muted tmp-p-3 rounded-bottom-2"
    div class="d-flex flex-column flex-sm-row flex-sm-items-center gap-2 undefined"
     div data-component="ButtonGroup" class="flex-self-stretch flex-shrink-0 undefined prc-ButtonGroup-ButtonGroup-vFUrY"
      div class="prc-ButtonGroup-Item-PqvDl"
       button type="button" data-component="Button" data-variant="default" aria-disabled="false" class="prc-Button-ButtonBase-9n-Xk flex-1"
        span data-component="buttonContent" class="prc-Button-ButtonContent-Iohp5"
         span data-component="text" class="prc-Button-Label-FWkx3"
      div class="prc-ButtonGroup-Item-PqvDl"
     span class="f6 fgColor-muted"
      button data-component="Link" class="prc-Link-Link-9ZwDx"
  div data-component="Stack" class="text-small flex-justify-end px-1 py-2 prc-Stack-Stack-UQ9k6"
   span class="fgColor-muted pr-1"
   button type="button" data-component="Button" data-variant="link" class="prc-Button-ButtonBase-9n-Xk Link--muted Link--inTextBlock text-normal"

This is the merge box of capture 01 (test/fixtures/pages/01) node for node: one ButtonGroup with an empty second item, the "command line" link, and the "Convert to draft" row. One attribute differs:

capture 01 (checks green) this report (a required check failing)
merge button data-variant="primary" data-variant="default"

The skeleton keeps no text, so the button's label that day is unknown ("Merge…" or "Enable auto-merge").

Analysis

  • Cause: selectors.mergeButton keyed on the button's variant, which follows the state of the checks. Nothing matched, so merge-button was logged.
  • Effect: §6.5 greyed nothing on the very PR whose checks were failing. The greying is visual only and never intercepts a click, so nothing is blocked or unblocked by this defect.
  • Severity tier: can wait for the batch (no change to what the extension blocks).
  • Pattern to look for across reports: a selector that depends on an attribute the page changes with its STATE (variant, color, disabled), not its structure.

Candidate fix

Branch claude/new-session-ovwve7, not merged: [data-testid="mergebox-partial"] [data-component="ButtonGroup"] button[data-component="Button"].

  • Measured in Chromium on the 8 captures: the same element as before on capture 01, nothing on the merged PRs and on the Files changed views.
  • Verified by removal: restoring the primary candidate makes the new real-page test fail with expected undefined to be <button …>.

Not measured

Any merge box state with another button that might sit in a ButtonGroup before the merge button: merge conflict, branch behind base ("Update branch"), several merge methods, the confirmation step after the click, draft, merge queue, bypass (danger). Captures of a conflicted PR and of a PR behind its base would settle the main risk.

Activity

  1. Reefact commented on Oct 31, 2026

    @Reefact
    OwnerAuthor

    issue (non-blocking): Repair the diagnostic archive links

    [P3] The four links in Full archive, as received contain mismatched backticks inside their Markdown destinations (for example, [the .zip](``https://...zip)``). They do not form valid Markdown links, making the retained diagnostic artifacts unnecessarily difficult to open from this issue. Replace them with ordinary label` links using the existing commit-pinned URLs. This affects issue navigation only; it does not change the diagnosed selector failure.

  2. added a commit that references this issue on Nov 1, 2026
  3. Reefact commented on Nov 1, 2026

    @Reefact
    OwnerAuthor

    Same cause, another state of the checks: in progress (v1.0.0-beta.20, 2026-11-01)

    Archive kept on branch diagnostic/2026-11-01-registration-merge-button: the .zip,`` report.json,```` the page skeleton.`````

    What the skeleton shows

    Merge box fully rendered at the instant of the failure (no loading spinner, unlike #116). Skeleton lines 4299 and 4320, 4417, 4534–4541:

    svg role="img" aria-label="Able to merge" data-component="Octicon" class="octicon octicon-git-merge fgColor-onEmphasis"
    …
    button type="button" aria-label="Collapse 3 in progress checks group" …
    …
    button type="button" aria-label="Collapse 4 successful checks group" …
    …
    div data-component="ButtonGroup" class="flex-self-stretch flex-shrink-0 undefined prc-ButtonGroup-ButtonGroup-vFUrY"
     div class="prc-ButtonGroup-Item-PqvDl"
      button type="button" data-component="Button" data-variant="default" aria-disabled="false" class="prc-Button-ButtonBase-9n-Xk flex-1"
       span data-component="buttonContent" class="prc-Button-ButtonContent-Iohp5"
        span data-component="text" class="prc-Button-Label-FWkx3"
     div class="prc-ButtonGroup-Item-PqvDl"
    span class="f6 fgColor-muted"
     button data-component="Link" class="prc-Link-Link-9ZwDx"
    

    The button group is node for node the one of the first report and of capture 01. The one attribute that differs is the same one:

    capture 01 (checks green) #113 first report (a required check failing) this report (3 checks in progress, 4 successful)
    merge button data-variant="primary" data-variant="default" data-variant="default"

    Analysis

    • Cause: the same — data-variant follows the state of the checks, and selectors.mergeButton keys on it. "In progress" is a second state, after "failing", in which the button is default. The mergeability icon says "Able to merge" and the button is enabled (aria-disabled="false"), so the PR was mergeable at that instant: the variant is not "mergeable or not", it is "all checks green or not".
    • Recovery: recoveredVisits: 1 of count: 2 — on one of the two visits the chain found its element later (2,084 ms). Which visit is not identifiable from the line (journal: a too-early probe overwrites the evidence of an unrecovered merge-button failure (v1.0.0-beta.19) #116). Checks finishing during a visit, turning the button primary, would produce exactly that; not measured.
    • Effect and tier: unchanged — §6.5 greys nothing while checks are running; visual only, waits for the batch.
    • Candidate fix of the first report (button[data-component="Button"] instead of the variant) would match this skeleton too: one Button in the group, in the first item.

    Not measured

    Still the same states: merge conflict, branch behind base, several merge methods, confirmation step, draft, merge queue, bypass. This report adds nothing on those.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions