Skip to content

fix(source-control): review-venue.sh gives absent, stale and healthy for the same repository minutes apart #9086

Open

Description

@kyle-sexton

Problem

plugins/source-control/skills/pull-request/scripts/review-venue.sh gives different verdicts for the same repository minutes apart, so /source-control:pull-request ready and prep run local AI reviews the CI lanes already cover. A run that wrongly reported ci healthy would instead skip a review that should run here.

Four runs against melodic-software/claude-code-plugins on 2026-10-22, 15:0x-15:2xZ, installed source-control 2.0.0:

  • run 1 and 2: code-review local absent: no recent pull_request run calls the code-review lane (same for security-review)
  • run 3: code-review local stale: .github/workflows/pr-review-hosted.yml has no run with a verdict among its newest 100
  • run 4 (under bash -x, stderr discarded): code-review ci healthy: newest run with a verdict, 39801569024, succeeded at 2026-10-22T15:05:46Z

The lanes were running: #9050's checks show pr-review / claude-review-status and pr-review-security / security-review passing. Run by hand, the discovery jq at review-venue.sh:100-103 against page 1 of actions/runs?event=pull_request&per_page=100 finds both callers (workflow ids 374687473 and 374687472); 45 of those 100 runs reference the reusable review workflows.

The host was recovering from heavy IO wait at the time, so slow or partial gh api responses are a candidate cause (a response that parses but holds fewer runs, or a page that shifted as new runs arrived). Not confirmed.

Fix

Find why the same inputs give absent, stale and healthy: check whether a short or shifted page passes the length < 100 early break (:110) or the verdict scan, and fail closed to local with a distinct reason (unreadable) instead of absent when a page read is incomplete.

Done when

  • Repeated runs against an unchanged repository give the same verdict.
  • An incomplete read reports a reason that says so, never absent.

Refs: #9082

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; the lanes App applied this class.

    Size: Small
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none
    Blocked by: none

    Understood: review-venue.sh returns different verdicts (absent, stale, healthy) for the same repository minutes apart, so local AI reviews run when CI already covers them. The suspected cause is an incomplete or shifted gh api page. The fix is to find the cause and fail closed to local with a distinct unreadable reason when a page read is incomplete.

    Nothing is missing to start. Reproducing the flaky read, for example by simulating a short or shifted page, should settle the root cause. No duplicates found among open issues.

    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 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. 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 26, 2026
  9. 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: review-venue.sh reports a lane as local unreadable (never absent or stale) when a workflow-runs page read is incomplete, and gives the same verdict on repeated reads of an unchanged repository.

    Acceptance criteria

    • review-venue.sh rejects a runs page whose JSON lacks a .workflow_runs array, treating it as unreadable instead of passing it to the discovery jq (currently .workflow_runs\[\]? at review-venue.sh:108 turns a missing key into no match)
    • review-venue.sh compares each page's .workflow_runs length with the response total_count (or an equivalent completeness check) so a short or shifted page is not taken as the end of the listing at the -lt 100 break (review-venue.sh:119)
    • When a lane is not found and the page reads were incomplete, the lane line is &lt;lane> local unreadable: &lt;detail> and never local absent; absent stays only for a complete read with no calling workflow
    • The same completeness check covers the per-workflow runs read at review-venue.sh:136-139, so an incomplete read there prints local unreadable and not local stale
    • The header usage comment (review-venue.sh:21) and the docs plugins/source-control/skills/pull-request/reference/review-venue.md and plugins/source-control/reference/providers/github/pull-request/review-venue.md list the unreadable reason and say it runs the review locally
    • review-venue.test.sh gains cases where the gh stand-in returns a page with no workflow_runs, a short page, and a count mismatch, and each asserts local unreadable and not absent or stale
    • review-venue.test.sh gains a case where the stand-in returns the same complete input twice and the two outputs are identical
    • bash plugins/source-control/skills/pull-request/scripts/review-venue.test.sh passes
    • plugins/source-control/CHANGELOG.md records the fix

    Related work

    Sources read

    • plugins/source-control/skills/pull-request/scripts/review-venue.sh:102-120: discovery loops up to 3 pages, uses .workflow_runs\[\]? which tolerates a missing key, and breaks when a page holds fewer than 100 runs; no total_count check
    • plugins/source-control/skills/pull-request/scripts/review-venue.sh:122-127: an empty workflow id prints local absent with no check of whether the page reads were complete
    • plugins/source-control/skills/pull-request/scripts/review-venue.sh:136-150: the per-workflow runs read has the same tolerant jq and prints local stale when no verdict is found
    • plugins/source-control/skills/pull-request/scripts/review-venue.sh:21-26: documented output states are absent, failing, stale; exit 2 covers gh failure or unparsable output; no unreadable state
    • plugins/source-control/skills/pull-request/scripts/review-venue.test.sh:251-274: existing tests assert the absent lines and exit 2 on unreadable state; no short-page cases
    • Line numbers in the issue (:100-103, :110) are stale: the discovery jq is now at review-venue.sh:107-111 and the length break at :119

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

  10. removed
    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.
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 26, 2026
  12. melodic-automation-lanes commented on Oct 26, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue lane stopped partway through this issue and needs a person.

    Why, in the run's own words:

    The run reported done but committed nothing.

    Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/40354760854

    To retry, remove needs-human and add agent-ready again.

  13. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 27, 2026
  14. kyle-sexton commented on Oct 27, 2026

    @kyle-sexton
    MemberAuthor

    Released for re-triage under the owner's 2026-10-26 rule: a person is involved only for "1. A change in original intent/vision 2. Something comes up during implementation ... that alters intent/vision or the primary design 3. If there is a HIGH/CRITICAL security issue". None applies here, so the hold label came off and intake triage runs again now.

    To hold this issue again, add needs-human (or status: needs-decision) and name which of the three applies.

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: 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