Skip to content

fix(pr-pipeline): the mint-failed re-fire for resolve-issue matches a step the read runner does not have #9102

Closed

Description

@kyle-sexton

Problem

didNoWork in .github/scripts/work-unblock/label-unblocked.mjs re-fires a resolve-issue run whose lane token mint failed by matching a step named "Request the lane token" under resolve-issue / run. resolve-issue calls pr-run-activity-read.yml, which has no such step (its broker step is "Ask the broker whether the lane may run"); "Request the lane token" exists only in pr-run-activity-write.yml. So a resolve-issue run whose broker refused or failed is never re-fired by that path. It fails toward not re-firing, so it is a stuck-issue risk, not a security one. Found while building #9097 (Security & Cost agreed).

Fix

Match the read runner's broker step (or the job/step names #9097's workflow-shape test pins) for resolve-issue, keep "Request the lane token" for the write-runner path, and extend that test to cover the mint-failed shape.

Related

Activity

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

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; a maintainer confirms or changes it.

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

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    [quote truncated; the full decision is at the link]

    #9102 (comment)

    The decision settles the open questions. The remaining work is to class a resolve-issue broker-check failure that isn't a kill-switch refusal as mint-failed, add tests for it, and update the two code comments.

    Automated triage. A maintainer reviews it.

  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 22, 2026
  4. github-actions commented on Oct 26, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  5. 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 26, 2026
  6. melodic-automation-lanes commented on Oct 26, 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).

  7. melodic-automation-lanes commented on Oct 26, 2026

    @melodic-automation-lanes
    Contributor

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

  8. melodic-automation-lanes commented on Oct 26, 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: A resolve-issue run whose broker-check step "Ask the broker whether the lane may run" failed for a non-kill-switch reason is classed mint-failed and re-fired, with the write runner's MINT_STEP kept and the workflow-shape test extended.

    Related work

    Open questions

    1. The issue looks partly stale: didNoWork already matches the read runner's BROKER_STEP for resolve-issue, but only to class a kill-switch refusal as a breaker trip, and the workflow-shape test already pins the read and write step names. Any other broker-check failure (5xx, other 403) still gets no re-fire. Is that remaining gap this issue's work?
      RECOMMENDED: Yes: when a resolve-issue broker-check job fails at BROKER_STEP and the refusal is not kill-switch, class it mint-failed so it is re-fired under the existing failed-mint bound, and add a test for that shape. Basis: .github/scripts/work-unblock/label-unblocked.mjs:791-811
    2. Should a workflow-modified refusal at broker-check be re-fired as mint-failed here, given #​9498 is open on stopping those refusals from failing runs?
      RECOMMENDED: Yes, re-fire any non-breaker broker-check failure; #​9498 can later stop the refusal itself. Basis: judgment
    3. Is the work covered by #​8446 (broker 5xx or token 403 re-fire), making this a duplicate?
      RECOMMENDED: Owner should check #​8446; I could not open it and judge it a related issue, not a duplicate, from its title. Basis: 8446

    Sources read

    • .github/scripts/work-unblock/label-unblocked.mjs:200-210: MINT_STEP is the write runner's step and BROKER_STEP the read runner's
    • .github/scripts/work-unblock/label-unblocked.mjs:791-811: broker-check failure only reaches breaker via a kill-switch refusal; mint-failed needs a failed MINT_STEP in any job
    • .github/scripts/work-unblock/label-unblocked.mjs:767: a broker-check refusal for another reason is none of the no-work classes
    • .github/scripts/work-unblock/label-unblocked.test.mjs:2291-2301: shape test pins the read runner's broker step and that only the write runner mints
    • .github/scripts/work-unblock/label-unblocked.test.mjs:2011-2028: BROKER_REFUSED fixture exists for the kill-switch case

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

  9. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    No owner ledger (.work/*/interview-checklist.md, .work/gh-monitor-owner-decisions/) names this issue.

    Already on main (.github/scripts/work-unblock/label-unblocked.mjs):

    Remaining gap: a broker-check failure for any other reason, or one whose log names no reason, falls through. The read runner has no MINT_STEP, so minting is null (:793), and no class matches (:803-811). The code comment says so: "A broker-check refusal for another reason, or one whose log gives none, is none of these" (:767). That run is never re-fired, which is the stuck-issue risk the body names.

    Questions from intake's refinement (#9102 (comment)):

    1. Is the remaining gap this issue's work?
      Decided: Yes. The body's problem is that "a resolve-issue run whose broker refused or failed is never re-fired by that path", and that still holds for every reason but the kill switch. Such a run is classed mint-failed, so it is re-fired under the existing failed-mint bound: up to limits.limit-stops-per-issue times per version of the lane workflow files, then on the stranded backoff (label-unblocked.mjs:91-99). No new bound or class is added. A kill-switch refusal stays breaker.
    2. Re-fire a workflow-modified refusal too?
      Decided: Yes. A re-fire starts a fresh run on main's workflow files (label-unblocked.mjs:84-89), which is what a stale-file refusal needs. The broker is asked again on every run, so a re-fire passes no gate it would refuse. fix(pr-pipeline): stop broker workflow-modified refusals failing work-resolve-issue runs #9498 (raw/full/9498.json, open) asks why those refusals happen and does not conflict.
    3. Duplicate of pr-pipeline: re-fire PR-lane runs lost to a broker 5xx or token 403 #8446?
      Decided: No. pr-pipeline: re-fire PR-lane runs lost to a broker 5xx or token 403 #8446's body covers PR-lane runs and refire-refused.mjs ("The issue lane re-fires runs refused at the token step ... but PR lanes do not", raw/full/8446.json). This issue is the issue lane's label-unblocked.mjs.

    Acceptance criteria:

    • In didNoWork, a resolve-issue job that failed at BROKER_STEP for a reason other than the kill switch, or whose log gives no reason, is classed mint-failed. The write runner's MINT_STEP match is unchanged.
    • A test in .github/scripts/work-unblock/label-unblocked.test.mjs uses the BROKER_REFUSED jobs with a non-kill-switch refusal log, and with no readable log, and asserts mint-failed. The existing kill-switch test still asserts breaker.
    • The comments at label-unblocked.mjs:91-93 and :767 say that a non-kill-switch broker-check failure is re-fired as mint-failed.
  10. 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.
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 26, 2026
  11. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed on Oct 26, 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