Repository navigation
fix(pr-pipeline): treat an incomplete GitHub search as unknown - #9089
Conversation
During the 2026-10-22 GitHub incident the search API answered total_count 0 with incomplete_results true for a repository with about 600 open issues. check-wip-cap already turned that answer into a failed read, but a failed queued read leaves admissions open, so work-unblock's admission gate had unlimited room on a false empty. readLaneWip now reports searchIncomplete when any answer says incomplete_results true, and wipStatus closes new admissions on or after pause-from with admission_basis and admission_reason search-incomplete; main logs a named warning. A read that fails without that answer still fails open, and no run pause changes. The deepEqual in the existing incomplete-read test gains the new searchIncomplete field: a shape addition, not a weakened assertion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ause-from says This repository's pr-pipeline.yaml sets pause-from "" (the queued cap alerts only), and wipStatus returned room null whenever pausing was false, so an incomplete search still admitted without limit. A search-incomplete read now sets room 0 regardless of pause-from (owner decision 2026-10-22); the queued cap itself still pauses only past pause-from. check-wip-cap's over-cap warning now names why the lane keeps running (unreadable base config, pause-from unset, or not reached), and work-unblock's deferral log names its reason instead of always citing the queued cap. The earlier pause-from-unset assertion (admissions open) is replaced by the owner's rule; the same fields are asserted for unset, future and past pause-from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… action description and header comments Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-security-review reviewed No security findings in PR 9089 at head a5cb225. I read the diff for all 7 changed files, and the
Manifest fields: none touched. |
|
claude-review reviewed Code review: PR #9089 (head a5cb225)No findings. I read the full diff and the surrounding Not run. I could not run the two changed test files ( What I checked by reading:
The PR body lists other search callers it leaves for a follow-up. I treated those as out of scope. |
…ts tests (#9120) No related issue: test-node fails on check-wip-cap tests when resolve-config is not selected (run 39809302124) ## Summary `test-node` failed in [run 39809302124](https://github.com/melodic-software/claude-code-plugins/actions/runs/39809302124/job/119931199035) with `Cannot find module 'yaml'` from `.github/actions/check-wip-cap/check-wip-cap.test.mjs:547`. That line loads `yaml` from resolve-config's `node_modules`. Only the "Test resolve-config" step installs them, and that step exits early unless the plan names `.github/actions/resolve-config`. A change that selected check-wip-cap without resolve-config therefore ran its suite with nothing installed. ## Fix - `.github/actions/check-wip-cap/package.json` declares `"resolve-config": "file:../resolve-config"`. `check-wip-cap.mjs` already imports `../resolve-config/resolve-config.mjs` at runtime. - `scripts/run-outside-node-suites.sh` runs `npm ci --ignore-scripts` once per run for each `file:` dependency that has a lockfile, before the package's `npm test`. On a warm cache it takes under a second, and it adds no resolve-config test run. - The planner already turns `file:` dependencies into triggers (`scripts/plan-test-lanes.sh:304-308`), so a resolve-config change now also runs check-wip-cap's suite. - One workflow comment is updated. Raising the job timeout was not needed. ## Verification - `scripts/run-outside-node-suites.test.sh`: a new fixture case (an npm stub; one locked and one unlocked `file:` dependency) went red first with `FAIL: expected one npm ci of pkgs/locked, then npm test: test`, then green with `PASS=8 FAIL=0`. - Reproduced locally with resolve-config's `node_modules` removed. `node --test` in check-wip-cap failed at `check-wip-cap.test.mjs:1:1`. Then `run-outside-node-suites.sh --paths` over the run's three packages installed resolve-config first, and all three passed: check-wip-cap 39/39, maintenance-audit-lane-runs 43/43, work-unblock 117/117. - These scripts pass: `plan-test-lanes.test.sh` (41/41), `check-docs-only-gate.test.sh` (88/88), `ci-test-node-stop-commands.test.sh` (2/2), and shellcheck. - No file in the broker's `BROKER_PATHS` is touched. ## Related - #9041 added the `createRequire` load of `yaml` from resolve-config. - #9097 and #9089 are blocked by this failure. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: GitHub search returned incomplete empty results during the 2026-10-22 Actions incident
Summary
During today's incident the search API answered
total_count: 0withincomplete_results: trueforrepo:melodic-software/claude-code-plugins is:issue is:open(the real count is about 601). The in-scope lane callers of GitHub search were audited:check-wip-cap.mjsis the one REST/search/issuescaller, and it already turned an incomplete answer into a failed read. A failed queued read left admissions open (admission_basis: fail-open), so work-unblock'sadmissionGategot unlimited room (admission_room ?? Infinity) on a false empty.The owner approved this behavior on 2026-10-22 ("pause admissions when GitHub search reports an incomplete answer"). It partly reverses the documented fail-open admission rule (#8804) for one case, an answer that says
incomplete_results: true. A read that fails without that answer still fails open.Fix
readLaneWipreturnssearchIncompletewhen any answer saysincomplete_results: true. A missing field still counts as a plain failed read.wipStatuscloses new admissions whether or notpause-fromis set or reached (admission_room0,admission_reasonandadmission_basissearch-incomplete). This repository setspause-from: "", so a gate tied topause-fromwould not apply here. The queued cap still pauses only pastpause-from, and no run pause changes.mainlogs::warning title=check-wip-cap::GitHub search answered incomplete results (admission_basis search-incomplete), so its counts are unknown and no new admissions are made this run.pause-fromis not set, orpause-fromis not reached.label-unblocked.mjs: room 0 already defers. The deferral log now names its reason (GitHub search answered incomplete results) instead of always citing the queued cap.docs/conventions/pr-pipeline/README.md(WIP cap section, status table) and a pr-pipeline changelog fragment.BROKER_PATHSinpr-require-checks.ymllists onlyresolve-configfiles), so no azure-iac pin PR is needed.createGitHubandrequest-budget.mjsare untouched, so this does not conflict with fix(pr-pipeline): retry a GitHub 5xx on lane lookups with backoff #9079.Verification
check-wip-cap.mjs: 4 failing incheck-wip-cap.test.mjsand 1 inlabel-unblocked.test.mjs.check-wip-cap.test.mjs: pause-from unset, future or past; main under this repository's ownpause-from: ""; the warning naming the config.label-unblocked.test.mjs: deferral with or without pause-from, and its reason in the log.check-wip-cap.test.mjspasses 43 of 43,label-unblocked.test.mjs119 of 119, andapply-dependency-verdict.test.mjs36 of 36.scripts/check-changelog-fragments.sh --checkand markdownlint pass.Related
Search callers with no incomplete signal, left for a follow-up:
.github/workflows/pr-merge.yml:547:gh pr list --authorruns through GraphQL search. A false empty lists no candidates, so it fails safe.babysit_gh.py:gh pr list --author(GraphQL search) andgh search prs(REST, but--jsondrops the flag). Discovery only.work-item-tracker/adapters/github/list-items.sh --label: GraphQL search.plugins/code-tidying/skills/tidy/scripts/open-pr-count.sh(a PR cap read throughgh pr list --search) andplugins/playbooks/skills/repo-sweep/scripts/state.sh(dedupe throughgh pr list --search).🤖 Generated with Claude Code