Skip to content

ci: end a work-resolve-issue kill-switch deny neutral, keeping work-unblock's re-fire #10753

Closed

Description

@kyle-sexton

Problem

A work-resolve-issue run that the token broker refuses with reason kill-switch at apply-issue-patch / run or report-outcome / run still ends red. This happened in 3 runs since 2026-10-24 (for example run 40597922545). The lane breaker turns the repository kill switch on after the run has read its variables, so only the broker's live read stops it. A kill switch is a designed stop and should not count as a failure.

#10737 adds request-lane-token's kill-switch-ok input and uses it in pr-merge and intake-triage. It leaves work-resolve-issue alone. work-unblock re-fires a stopped issue by finding the failed Request the lane token step and its ##[error]lane-token-denied ... reason kill-switch line (.github/scripts/work-unblock/label-unblocked.mjs, DENIAL.token and the mints.some(... "success") short-circuit). A green step would therefore leave the issue unclaimed.

Fix

  1. Teach label-unblocked.mjs to read a skip-reason=kill-switch stop as a breaker trip. That means a successful mint step that minted no token, together with its lane-token-stopped notice, or a job output naming the stop.
  2. Then opt pr-run-activity-write.yml's token step in, and gate its later steps and jobs as fix(pr-pipeline): end designed stops cleanly and keep held pull requests out of the merge queue #10737's callers.test.mjs check requires.

Done when

  • A kill-switch refusal in work-resolve-issue ends green.
  • work-unblock still re-fires that issue as a breaker trip, with a test.

Related

Refs: #10737

Activity

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

    @github-actions
    Contributor

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

    Size: Medium
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: make a kill-switch refusal in work-resolve-issue runs end green, while work-unblock keeps re-firing the issue as a breaker trip. It should read the successful mint step's lane-token-stopped notice with skip-reason kill-switch, and keep the old failed-step path for earlier runs.

    Decision recorded. The refinement's two questions (#10753 (comment)) are settled from main at 57f3225:
    [quote truncated; the full decision is at the link]
    #10753 (comment)

    That decision settles the open questions. Nothing further is needed from you.

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

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: a criterion names .github/workflows/pr-run-activity-write.yml, which the issue lane cannot push (patch-protected-path); a builder session takes it. 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 28, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: confirmed; its comment says why.

  7. melodic-automation-lanes commented on Oct 28, 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 kill-switch refusal in work-resolve-issue ends green, and work-unblock still re-fires the issue as a breaker trip, read from a skip-reason=kill-switch stop.

    Dependencies

    • #​10737: not in the checkout, so the kill-switch-ok input, the skip-reason=kill-switch output and the lane-token-stopped notice do not exist yet

    Related work

    Open questions

    1. Should this issue wait until #​10737 merges, so its kill-switch-ok input, skip-reason=kill-switch output and lane-token-stopped notice exist to build on?
      RECOMMENDED: Yes. Hold it behind #​10737 and write the criteria after that PR lands, against its real output names. Basis: .base/.github/actions/request-lane-token/action.yml:93 documents only skip-reason=workflow-modified, and a search of .base/.github finds no kill-switch-ok.
    2. Which signal should label-unblocked.mjs read as a breaker trip: a successful mint step with no token plus its lane-token-stopped notice, or a job output naming the stop?
      RECOMMENDED: Read the successful mint step with no token and its notice. Keep the failed-step DENIAL.token path for runs that predate the change. Basis: .base/.github/scripts/work-unblock/label-unblocked.mjs:246

    Sources read

    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/actions/request-lane-token/action.yml:93: describes an opt-in that ends the step green with a skip-reason output, and only workflow-modified exists today
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/workflows/pr-run-activity-write.yml:1051: the request-lane-token step, with no kill-switch-ok input set
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/scripts/work-unblock/label-unblocked.mjs:246: BREAKER = kill-switch, read from the failed token step
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github: a search finds no kill-switch-ok anywhere

    To answer, post a comment that starts with this line:

    **Decision recorded.** <answer>
    

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

  8. removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Oct 30, 2026
  9. kyle-sexton commented on Oct 30, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The refinement's two questions (#10753 (comment)) are settled from main at 57f3225:

    1. Wait for fix(pr-pipeline): end designed stops cleanly and keep held pull requests out of the merge queue #10737? Not any more: it merged (68bdb66). request-lane-token now has kill-switch-ok (.github/actions/request-lane-token/action.yml:92). With it, a kill-switch 403 ends the step green with a lane-token-stopped notice, no token and skip-reason kill-switch (.github/actions/request-lane-token/README.md:27, :39). fix(pr-pipeline): let a kill-switch stop skip cleanly and re-fire pr-unblock heads after the switch lifts #10844 (bd6c37d) opted pull request runs in, but kept issue runs red on purpose until work-unblock can read the new stop: kill-switch-ok: ${{ inputs.issue-number == '' && ... }} (.github/workflows/pr-run-activity-write.yml:1073). That leftover is this issue.
    2. Which signal does label-unblocked.mjs read? The successful mint step's lane-token-stopped notice with skip-reason kill-switch. The failed-step DENIAL.token path (.github/scripts/work-unblock/label-unblocked.mjs:264-269, :1080-1088) stays for runs that predate the change.

    This changes no intent: a kill switch still stops the run, and only the run's colour changes.

    Acceptance criteria:

    • A kill-switch refusal in a work-resolve-issue run ends green (.github/workflows/pr-run-activity-write.yml:1073). (body, unchanged)
    • work-unblock still re-fires that issue as a breaker trip, and a test covers it. (body, unchanged)
    • A run from before the change, failed with lane-token-denied ... reason kill-switch, is still read as a breaker trip. (body, amended: keeps the existing path, per question 2)
  10. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    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 30, 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

    priority: mediumReal value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.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