Skip to content

fix(code-tidying): upkeep batch PRs carry no spec, so pr-verify fails every one #12828

Closed

Description

@kyle-sexton

Problem

Every pull request the code-tidying upkeep batch opens (#12674) stalls. pr-verify judges a pull request only against the spec text of its linked issues (docs/conventions/pr-pipeline/README.md:726-727, resolve-pr.mjs linkedIssues). The batch writes No related issue: code-tidying upkeep sweep. as each body's first line, so pr-verify has nothing to judge against and fails the head.

Seen on the first live run (https://github.com/melodic-software/claude-code-plugins/actions/runs/41588965297), which opened #12763, #12764 and #12765:

upkeep_max_open is 3, so these three fill the cap and the daily batch opens nothing new until a session clears them by hand. Every later batch will stall the same way.

Options

  1. The batch links a standing spec issue: an open, agent-ready issue whose body holds the upkeep sweep contract (structure-only edits, Beck's tidyings, behaviour unchanged, hook-wired files left alone). Each PR body opens Refs: #<that issue>. Nothing in pr-verify changes.
  2. pr-verify reads a spec from a tracked convention file when the PR is lanes-App-authored on a chore/tidy-adhoc-* branch. This adds a second spec source to pr-verify.
  3. pr-verify skips upkeep PRs. This drops the only check that the tidy left behaviour unchanged.

Recommended: 1. Basis: it uses the spec path pr-verify already has (linkedIssues), with no new mechanism. #9294 made pr-verify judge a Refs-linked lane PR against its issue.

Done when

  • The upkeep batch's PR body links a spec that pr-verify reads, and pr-verify passes or fails an upkeep PR on its content, not with "no spec".
  • One live upkeep run's PR reaches the merge queue through pr-merge without a session.

Refs: #12475, #12674

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 3, 2026
  2. github-actions commented on Nov 3, 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: upkeep batch PRs open with "No related issue" and no Refs:, so pr-verify has no spec and fails them. The three open PRs fill upkeep_max_open, so the daily batch stalls. The issue picks option 1: link a standing spec issue with Refs: #N in each PR body. No duplicates found among open issues. The live-run done-when item can't be checked in this lane; the batch change itself can.

    Automated triage, applied by the lanes App.

  3. added
    priority: highSignificant impact, or blocks an imminent release; staff this cycle.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 3, 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.
    on Nov 3, 2026
  5. melodic-automation-lanes commented on Nov 3, 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. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 3, 2026
  7. melodic-automation-lanes commented on Nov 3, 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: The upkeep batch writes Refs: #N of a standing spec issue as each PR body's first line, so pr-verify judges upkeep PRs against that spec instead of failing with no spec.

    Related work

    Open questions

    1. Which open, agent-ready issue is the standing spec issue the batch links, and who creates it? None is named, and an unattended run cannot create one or know its number.
      RECOMMENDED: The owner opens one issue holding the sweep contract (structure-only edits, Beck's tidyings, behaviour unchanged, hook-wired files left alone) and records its number in a Decision recorded comment. Basis: judgment
    2. Where does the batch read the spec issue number from? Nothing holds it now; batch.mjs only names the No related issue line.
      RECOMMENDED: Add an upkeep_spec_issue setting to docs/conventions/code-tidying.yaml, with schema and reference/config.md entries, read by upkeep.mjs and passed to promptText. Basis: .base/.github/scripts/maintenance-tidy-code-upkeep/batch.mjs:74
    3. Should plan validation enforce the Refs line, or only the prompt ask for it? The model writes the body and validatePlan checks only that it is a string.
      RECOMMENDED: Have validatePlan or the publish step require or prepend Refs: #N as the first line, so a model slip cannot repeat the stall. Basis: .base/.github/scripts/maintenance-tidy-code-upkeep/batch.mjs:108
    4. The live-run done-when item cannot be checked unattended. Should it become a post-merge check a person runs?
      RECOMMENDED: Yes: keep the code change as the checkable scope and treat the live run as a person's check. Basis: judgment

    Sources read

    • .base/.github/scripts/maintenance-tidy-code-upkeep/batch.mjs:73-76: the prompt tells the model each PR body starts with No related issue: code-tidying upkeep sweep.
    • .base/.github/scripts/maintenance-tidy-code-upkeep/batch.mjs:108: validatePlan checks only that pr.body is a string under 60000 characters
    • .base/.github/scripts/pr-verify/resolve-pr.mjs:600-621: linkedIssues reads closing issues, else the issue named by a Refs line in the PR body
    • .base/.github/scripts/maintenance-tidy-code-upkeep/batch.test.mjs:18: the test fixture uses the No related issue body
    • .base/docs/conventions/code-tidying.yaml:6: upkeep_max_open is 3

    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. self-assigned this
    on Nov 3, 2026
  9. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor
    No description provided.
  10. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Decision: option 1. The upkeep batch links a standing spec issue with Refs: #<n> as each PR body's first line; pr-verify is unchanged. Basis: pr-verify already judges a Refs-linked lane PR against its issue (#9294, resolve-pr.mjs linkedIssues); option 2 adds a second spec source and option 3 drops the only behaviour-unchanged check. Constraint for the build: the standing spec issue must stay out of the issue lane's frontier (it is never worked or closed), whatever label pr-verify needs to read it. Claimed by this session; building now.

  11. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    and removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Nov 3, 2026
  12. added
    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 Nov 3, 2026
  13. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    PR #12898 merged: upkeep PRs now open with Refs: #12894, the standing spec issue, so pr-verify judges them on content. Remaining (the second done-when): the next daily upkeep run's PR reaching the merge queue through pr-merge without a session. Close this issue when that happens; reopen work here if that PR stalls.

  14. kyle-sexton commented on Nov 4, 2026

    @kyle-sexton
    MemberAuthor

    Both done-when items are met. The live upkeep run opened PR 13102, whose body opens Refs: #12894. pr-verify judged it on content: pass-notes, spec_kind: refs, linked issue 12894 (artifact pr-verify-13102-07344c96b3602c2643e57dcd52be69358580b1ad-pass-notes), with no "no spec" failure. The merge path armed it as melodic-automation-lanes[bot] with rung C2 at 06:00:34Z, it entered the merge queue at 06:00:36Z, and it merged at 06:07:35Z. No session touched it.

  15. kyle-sexton commented on Nov 4, 2026

    @kyle-sexton
    MemberAuthor

    Delivered: closing as completed.
    Agent choice, not an owner answer.

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

Metadata

Metadata

Assignees

Labels

priority: highSignificant impact, or blocks an imminent release; staff this cycle.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

Work status

confirmed

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions