Skip to content

pr-merge: enable-auto-merge drops the verdict reader's babysit-listing-miss stderr #10887

Closed

Description

@kyle-sexton

Problem

enable-auto-merge runs babysit_verify_evidence.py once per candidate and keeps only one line of its stderr, the babysit-gh-calls line. The reader prints a babysit-listing-miss {...} line on stderr for every incremental read that misses GitHub's live artifact count (Reader._incremental, LISTING_MISS_PREFIX). Those lines never reach the job log. When a candidate falls back to the full repository listing, the log cannot show why.

Where the line is dropped

.github/scripts/pr-merge/enable-auto-merge.mjs at 82432cf, in pythonVerify:

  • L1007: spawn("python3", ...) with encoding: "utf8" captures the reader's stderr into done.stderr.
  • L1022-L1025: ghCallsLine(done.stderr) prints only the babysit-gh-calls line. Every other stderr line is discarded.
  • A refusal such as verify:unreadable exits 0, so the error branch, which would print the last stderr line, does not run either.

Evidence

In enable-auto-merge run 40817220695, candidate #10867 logged:

enable-auto-merge: #10867 calls=128 github-token=124 paginated=0 ms=107111 cached=0
babysit-gh-calls {"calls":{..."override GET repos/{}/{}/actions/artifacts":7,"override GET {}/{}/actions/artifacts":117},...}
enable-auto-merge: #10867 left: pr-merge's gate refuses its verifier verdict (verify:unreadable)

That is 7 incremental page calls, then 117 full-listing pages over 107 s, ending in a refusal. No babysit-listing-miss line appears anywhere in the job log. Three possible causes remain open: the incremental reads missed the live count, a page failed, or the base was rejected.

Fix

Print each babysit-listing-miss line from done.stderr beside the babysit-gh-calls line. Better: print every stderr line except the gh-calls line when the reader's verdict is a refusal. enable-auto-merge.test.mjs would need a case for it. Note that #10743 also edits that test file.

Refs: #10880

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 29, 2026
  2. github-actions commented on Oct 29, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Low
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: enable-auto-merge's pythonVerify keeps only the babysit-gh-calls stderr line from the verdict reader. It drops every babysit-listing-miss line, including when the reader exits 0 with a refusal such as verify:unreadable. The fix is to print those lines beside the gh-calls line and add tests. The refinement comment's acceptance criteria already cover this, so nothing is missing. The overlap with PR #10743 on the test file may need a rebase. I found no duplicate. #9497 and the logging work in the open issue list are related but cover different lines.

    Automated triage, applied by the lanes App.

  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 29, 2026
  4. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 29, 2026
  5. melodic-automation-lanes commented on Oct 29, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: no trusted-human acceptance criteria: a listed human must put the confirmed - [ ] criteria in the body or post them as their own comment, or, on an issue a listed human filed, intake's newest refinement comment must hold them unedited. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  6. melodic-automation-lanes commented on Oct 29, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  7. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    and removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Oct 29, 2026
  8. melodic-automation-lanes commented on Oct 29, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: enable-auto-merge's pythonVerify prints every babysit-listing-miss stderr line from the verdict reader to the job log beside the babysit-gh-calls line, with a test.

    Acceptance criteria

    • enable-auto-merge.mjs has an exported helper (e.g. listingMissLines(stderr)) that returns each stderr line starting with babysit-listing-miss (CR trimmed), in order, and an empty array when there are none
    • pythonVerify in .github/scripts/pr-merge/enable-auto-merge.mjs console.logs each of those lines unchanged right beside the babysit-gh-calls line, after the cost line
    • The lines are printed whatever the reader's exit status, including status 0 with a refusal such as verify:unreadable
    • The babysit-gh-calls line is still printed exactly once and is never duplicated by the new output
    • enable-auto-merge.test.mjs has a case where the spawn stub exits 0 with two babysit-listing-miss lines and a babysit-gh-calls line on stderr, and asserts both miss lines appear in the captured console output
    • enable-auto-merge.test.mjs has a helper case: stderr with no listing-miss line gives an empty result, and unrelated stderr lines are not printed
    • Existing tests in enable-auto-merge.test.mjs still pass (node --test .github/scripts/pr-merge/enable-auto-merge.test.mjs exits 0)

    External state: none

    Dependencies

    • PR #​10743 also edits enable-auto-merge.test.mjs; expect a possible merge conflict in the test file and rebase on it if it lands first

    Related work

    Sources read

    • .github/scripts/pr-merge/enable-auto-merge.mjs:979-1045: pythonVerify spawns the reader, logs costLine, then only ghCallsLine(done.stderr) at L1022-1025; the stderr tail is shown only when status is non-zero (L1033-1040)
    • .github/scripts/pr-merge/enable-auto-merge.mjs:909-932: GH_CALLS_PREFIX and ghCallsLine parse and re-emit only the gh-calls line
    • plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py:323: LISTING_MISS_PREFIX = "babysit-listing-miss"
    • plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py:1195: the reader prints the miss as a single-line json.dumps(miss, sort_keys=True) on stderr
    • .github/scripts/pr-merge/enable-auto-merge.test.mjs:2433-2463: existing ghCallsLine tests to model the new cases on

    Automated refinement by the lanes App. Intake triages the issue again with it.

  9. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 29, 2026
  10. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    on Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions