Skip to content

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

Open

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 yet: 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; intake's refinement of this body is due and may supply them.

  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.**.

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: highSignificant impact, or blocks an imminent release; staff this cycle.status: needs-decisionAwaiting a human or maintainer judgment call.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    Work status

    needs-owner-decision

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions