Skip to content

ci(lanes): run every model lane on the same key, subscription and fallback chain #13586

Open

Description

@kyle-sexton

No related issue: owner decision in the Automation Lanes session, 2026-11-05.

Owner decision (verbatim)

The owner asked, in session: "if anything fails on API credit, it should always roll back to the subscription. If that fails, there's a fallback subscription. Did we have that in place for all of these automations?"

Asked as an AskUserQuestion pick, Q1, which named the release lane's outside-authored changelog input and rule R220. Owner's pick, verbatim: "All nine (Recommended)".

Then, verbatim: "I want them all to be consistent and uniform."

This loosens R220 for upstream-apply-changelog.yml: that lane now gets the subscription and fallback legs. The owner made this pick in their own words, in the session.

Gap (read at origin/main, 2026-11-05)

Every other model lane already runs API key, then role subscription, then FALLBACK_CLAUDE_CODE_OAUTH_TOKEN. It hands off on a credit stop or a 401/402, and on the subscription leg also on a limit stop (ci-workflows run-claude-cli action.yml:7-16; pr-run-activity-read.yml:10-17). These do not:

Workflow Legs today
upstream-apply-changelog.yml (both model legs) key only (:352, :634; :152-156 skips a credit-stopped key)
pr-unblock.yml adjudicate-feedback key only (:1858-1862)
intake-triage.yml refine-issue key, then subscription, with no fallback (:1116-1120)
pr-verify-capture.yml key, then subscription, with no fallback (:37-38)
post-merge-test-mutation.yml subscription only
maintenance-tidy-code-upkeep.yml subscription only
maintenance-measure-skill-edit.yml subscription only
eval-browser-dispatch.yml subscription only
eval-hill-climb-pass.yml subscription only

Done when

  • Every model-running workflow runs the same three-leg chain through the same mechanism: role API key, then role subscription, then FALLBACK_CLAUDE_CODE_OAUTH_TOKEN, with the same handoff triggers. No lane keeps its own variant.
  • A test fails when a model-running workflow lacks a leg, or passes credentials outside that mechanism.
  • The release lane's credit-stop skip is removed or reduced to the shared key-credit gate, and its header no longer says it has no subscription leg.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 5, 2026
  2. kyle-sexton commented on Nov 5, 2026

    @kyle-sexton
    MemberAuthor

    Owner confirmation (in the Automation Lanes session, 2026-11-05). A side agent raised that the release lane would also hold FALLBACK_CLAUDE_CODE_OAUTH_TOKEN, and that nobody had checked which account owns it. The owner answered, verbatim:

    "This is fine. It's Anthropic's upstream stuff, so if they're compromised, then we're fucked, more than just me. That's a major issue. As far as Anthropic, if we're reading their change logs, I have no concerns there. I want this."

    Two scope additions, from the key owner (GitHub Support hub):

    • Every lane in this change uses the shared ci-workflows check-key-credit gate. A key whose last outcome was a credit stop is then skipped for the key-credit window rather than refused on each run.
    • Each run records per-leg timing and the leg's outcome in the existing lane telemetry.
  3. github-actions commented on Nov 5, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: structural
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Known
    Flags: security
    Blocked by: none

    I understand this as a request to give all nine model-running workflows the same three-leg credential chain. The chain is role API key, then role subscription, then FALLBACK_CLAUDE_CODE_OAUTH_TOKEN. It also asks for a test that fails when a lane lacks a leg or passes credentials outside the shared mechanism, and for the release lane's credit-stop skip and header to be cleaned up.

    The body cites an owner decision to loosen R220 for upstream-apply-changelog.yml. No **Decision recorded.** comment backs it, so I can't treat it as settled. That lane reads outside-authored changelog input. Giving it subscription tokens widens the credential exposure on an untrusted-input path, which is a trust-boundary choice for a person.

    1. Should upstream-apply-changelog.yml get the subscription and fallback legs despite R220?
      RECOMMENDED: Yes, but only behind the same shared mechanism and only if the lane's untrusted-input handling is unchanged. The body records the owner's "All nine" and "consistent and uniform" picks.

    The other eight workflows are ordinary work.

    To answer, post a comment that starts with this line:

    **Decision recorded.** <answer>
    

    Automated triage, applied by the lanes App.

  4. added
    area: securitySecurity-relevant: vulnerability, hardening, or disclosure follow-up.
    priority: mediumReal value, no hard deadline; normal backlog flow.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Nov 5, 2026
  5. melodic-automation-lanes commented on Nov 5, 2026

    @melodic-automation-lanes
    Contributor

    The triage verdict left this issue at status: needs-decision:

    • flagged: security
    • held by status: needs-decision
    • no lanes App verdict comment shows whether an earlier verdict was flagged

    Reason: security

  6. added
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 5, 2026
  7. kyle-sexton commented on Nov 5, 2026

    @kyle-sexton
    MemberAuthor

    Owner decision Q2 (AskUserQuestion, Automation Lanes session, 2026-11-05). The maintenance role's lanes (eval-browser-dispatch, eval-hill-climb-pass, maintenance-measure-skill-edit) have no key leg, because the org has no MAINTENANCE_CLAUDE_API_KEY secret. Owner's pick, verbatim: "You add a maintenance key (Recommended)". The owner creates the org secret, with visibility all like the other role keys. Then the key leg is added like every other role's.

    Still open in this issue:

    • post-merge-test-mutation moves from claude-code-action to run-claude-cli.
    • The check-key-credit gate goes on the lanes that already had all three legs (owner: "consistent and uniform").
    • claude plugin eval lanes need a handoff classifier for the fallback leg.
  8. 2 remaining items

  9. kyle-sexton commented on Nov 5, 2026

    @kyle-sexton
    MemberAuthor

    Maintenance key pushed (Q2). After #13610 merged, the claude-code-account-rotation leader reloaded the lane catalog. It then pushed claudeautomations@yahoo.com's stored Console key to MAINTENANCE: POST /api/accounts/claudeautomations%40yahoo.com/api-key/push, roles [MAINTENANCE], auto-reload off, extra usage off, per the standing direction s3.

    gh api orgs/melodic-software/actions/secrets/MAINTENANCE_CLAUDE_API_KEY reads visibility=all updated=2026-11-05T22:11:11Z. The tool's catalog row reads keyed: true with keySecret: MAINTENANCE_CLAUDE_API_KEY, so this key half is operated through the tool like every other role's.

    Next: give the maintenance lanes (eval-browser-dispatch, eval-hill-climb-pass, maintenance-measure-skill-edit) their key leg, then move post-merge-test-mutation to run-claude-cli.

  10. kyle-sexton commented on Nov 6, 2026

    @kyle-sexton
    MemberAuthor

    Intake leg landed: melodic-software/ci-workflows#996 merged (key-credit gate plus a !cancelled() guard so a failed gate job still runs the key leg), after melodic-software/standards#950 and melodic-software/standards#951 and #13630 / #13660 (the caller's actions: read). The mutation lane landed in #13632.

    One gap keeps the first box open: the plugin-eval key leg does not hand off on auth_failed. Run https://github.com/melodic-software/claude-code-plugins/actions/runs/42172606678 ended partial (auth_failed) while the handoff classifier printed outcome=success, so the subscription leg never ran (#12035). The fix is in progress on fix/eval-auth-failed-handoff; this issue closes when it merges.

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

    area: securitySecurity-relevant: vulnerability, hardening, or disclosure follow-up.priority: mediumReal value, no hard deadline; normal backlog flow.status: needs-decisionAwaiting a human or maintainer judgment call.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Type

    Fields

    Work status

    needs-owner-decision

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions