Skip to content

fix(pr-pipeline): close admissions when check-wip-cap cannot load its config #9121

Closed

Description

@kyle-sexton

Problem

check-wip-cap silently drops its caps when its config dependency breaks. .github/actions/check-wip-cap/check-wip-cap.mjs:282-290 turns a failed import of resolve-config into the default limits with only a warning, and action.yml:75-76 turns a failed npm ci into a warning. A broken dependency therefore takes the caps off, and work-unblock can admit without limit, the same shape as the 2026-10-22 incomplete-search incident (#9089), triggered by a dependency instead of the API. Found by Security & Cost while passing #9120.

Fix

A failed resolve-config import or dependency install keeps the last saved state (as run pauses already do through keepLastState), or sets admission room to 0 with reason config-unreadable and a named ::warning. Run pauses stay as they are. Basis: #9089's owner-approved rule that an unknown read closes admissions.

Related

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: Low
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Decision recorded. The owner answered in the Issue Triage session (2026-10-25), accepting the recommended answers below:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    AND whatever is aligned with my overall goal of lowest friction, highest throughput (within our environmental, github, rate limit, etc. constraints)

    [quote truncated; the full decision is at the link]

    #9121 (comment)

    The decision settles the open questions: close admissions with config-unreadable, keep npm ci non-fatal with a reworded warning, update the action.yml description, and add a unit test. No duplicates found. This is a bounded fix to check-wip-cap and its action.yml, so no further questions.

    Automated triage, applied by the lanes App.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 22, 2026
  4. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 25, 2026
  5. kyle-sexton commented on Oct 25, 2026

    @kyle-sexton
    MemberAuthor

    Released for re-triage under the owner's 2026-10-24 rule: an issue stops for a person only for an intent or vision question, a security call, a host or attended run, or spend outside prepaid credit. The hold label came off and intake triage runs again now; it re-applies a hold, with a numbered question, when one of those applies.

    To hold this issue again, add needs-human (or status: needs-decision) and say why in a comment.

  6. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    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 25, 2026
  7. 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: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 25, 2026
  8. melodic-automation-lanes commented on Oct 25, 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).

  9. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  10. melodic-automation-lanes commented on Oct 25, 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: When check-wip-cap cannot read the base config (failed resolve-config import or failed npm ci), admissions close with admission_reason config-unreadable and a named warning, while run pauses keep their last-state behavior.

    Related work

    Open questions

    1. Which of the issue's two fixes applies on a config read failure: keep the last saved admission state, or set admission room to 0 with reason config-unreadable?
      RECOMMENDED: Set admission room to 0 with admission_reason config-unreadable and a named ::warning. keepLastState saves only the pause, not admission fields, so keeping last state would need new state handling, while closing matches the unknown-read-closes rule and is simpler to check. Basis: .github/actions/check-wip-cap/check-wip-cap.mjs:300
    2. Should the wipStatus admission_basis also gain a config-unreadable value, and should the action.yml npm ci failure (action.yml:76-77) fail the step or only continue so the import failure triggers the close?
      RECOMMENDED: Yes to a config-unreadable admission_basis; keep npm ci non-fatal with its warning reworded, since the import failure in baseConfig then sets configError and closes admissions, keeping one code path. Basis: .github/actions/check-wip-cap/action.yml:76
    3. Should the action.yml description and the admission-open output text, which now say a failed read leaves true, be updated and a test added for the config-error case?
      RECOMMENDED: Yes: update both descriptions and add a unit test where baseConfig fails and asserts admission_open false, admission_reason config-unreadable. Basis: .github/actions/check-wip-cap/action.yml:40

    Sources read

    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/actions/check-wip-cap/check-wip-cap.mjs:318-327: baseConfig catches the resolve-config import failure, warns, and returns LIMIT_DEFAULTS with configError true (the issue's cited lines 282-290 have moved)
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/actions/check-wip-cap/check-wip-cap.mjs:215-221: room is 0 only for searchIncomplete or truncated; otherwise null when not pausing, so admission stays open
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/actions/check-wip-cap/check-wip-cap.mjs:300-310: keepLastState keeps only paused and pause_reason from the prior state, not admission fields
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/actions/check-wip-cap/check-wip-cap.mjs:348-350: configError sets readError and pausing true
    • /home/runner/work/claude-code-plugins/claude-code-plugins/.base/.github/actions/check-wip-cap/action.yml:76-77: a failed npm ci only warns that the default WIP config applies

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

  11. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Issue Triage session (2026-10-25), accepting the recommended answers below:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    AND whatever is aligned with my overall goal of lowest friction, highest throughput (within our environmental, github, rate limit, etc. constraints)

    Question asked: On a config read failure, close admissions (room 0, reason config-unreadable) rather than keep the last saved state?

    1. (intake Q1) Which of the body's two fixes? Security-relevant: today a broken dependency takes the caps off.
      Accepted: Close: admission room 0, admission_reason config-unreadable, a named ::warning. keepLastState keeps only paused and pause_reason, so "keep last state" would need new state handling; closing matches the body's cited fix(pr-pipeline): treat an incomplete GitHub search as unknown #9089 rule that an unknown read closes admissions. Basis: kept; .github/actions/check-wip-cap/check-wip-cap.mjs:300-310 (keepLastState), :215-221 (room is 0 only for an incomplete or truncated search), :318-327 (baseConfig falls back to defaults).
    2. (intake Q2) Add config-unreadable to admission_basis; should a failed npm ci fail the step?
      Accepted: Yes to the basis value. Keep npm ci non-fatal with a reworded warning: the import then fails, sets configError, and closes admissions through one code path. Basis: kept; check-wip-cap.mjs:257 (admission_basis), action.yml:76-77.
    3. (intake Q3) Update the descriptions and add a test?
      Accepted: Yes. Update the action.yml text that says a failed read leaves true, and add a unit test where baseConfig fails. Basis: kept; action.yml:40.

    Acceptance criteria:

    • When the resolve-config import fails, check-wip-cap outputs admission_open false, admission_reason config-unreadable, admission_basis config-unreadable, and a named ::warning.
    • Run pauses keep their current last-state behavior.
    • A failed npm ci still continues, and its warning says admissions close.
    • action.yml's admission-open description states the config-unreadable case.
    • A unit test covers the config-error case.
  12. added
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    on Oct 28, 2026
  13. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    on Oct 28, 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

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.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