Skip to content

[Cross-Squad] Make generated workflow runners and checkout security configurable #1502

Open

Description

@desharpe

Source squad: desharpe/HealthAgent
Request type: cross-repository task delegation
Routing: Booster (CI/CD), with CONTROL/RETRO review
Related: #1493, #1462

Problem

@bradygaster/squad-cli and @bradygaster/squad-sdk currently emit GitHub Actions workflows with hardcoded hosted runners and mutable action tags. CLI upgrade also duplicates non-NPM workflow stubs, so repository-local template hardening is not preserved for standalone/global installs. This blocks downstream repositories that require organization-specific self-hosted runner labels and secure checkout defaults.

HealthAgent confirmed that patching installed package files from postinstall is not an acceptable fix: it is repository-specific, misses standalone/global CLI usage, and can generate the wrong ecosystem workflow.

Requested generic fix

  • Add shared workflow-generation options supporting scalar or multi-label runs-on values without hardcoding a downstream repository's policy.
  • Make secure checkout defaults explicit: immutable action references and persist-credentials: false.
  • Consolidate CLI init/upgrade and non-NPM stubs on the shared generic renderer instead of duplicating workflow YAML generation.
  • Expose equivalent runner/security options through the public SDK CI generator.
  • Persist optional workflow-generation configuration in .squad/config.json so squad upgrade can reproduce the intended policy.
  • Validate configured runner/action values and reject control characters or mutable action references where custom refs are accepted.
  • Keep generated workflows ecosystem-aware for npm, .NET, Go, Python, Java, and unknown projects.

Acceptance criteria

  1. Fresh init and upgrade from a globally installed CLI honor configured scalar and multi-label runners.
  2. Public SDK generation produces the same runner and checkout-security behavior as the CLI.
  3. Upgrade no longer replaces a configured self-hosted policy with ubuntu-latest.
  4. Generated checkout steps use immutable pins and disable persisted credentials by default.
  5. Generic ecosystem tests cover init, upgrade, standalone/global package behavior, and SDK generation.
  6. CLI and SDK receive changesets and the fix is published on npm.

Downstream dependency: desharpe/HealthAgent#190. HealthAgent will remove its rejected local postinstall patch and upgrade to the published fixed packages before its runner-policy PR can merge.

Activity

  1. added
    squadSquad triage inbox — Lead will assign to a member
    on Aug 23, 2026
  2. bradygaster commented on Aug 23, 2026

    @bradygaster
    Collaborator

    Owner & rationale

    Owner: Booster (squad:booster). This is a workflow-generation policy/configuration problem: emitted GitHub Actions runners and checkout security defaults are hardcoded today. CONTROL and RETRO should review the final design, but Booster should own the CI/CD behavior and verification gate.

    Readiness: go:needs-research. The ask is RFC-shaped because it spans CLI templates, CLI upgrade config persistence, SDK CI generation, scheduler-generated workflows, validation rules, and security defaults.

    Files in scope

    Verified existing paths:

    • packages/squad-cli/src/cli/core/upgrade.ts
    • packages/squad-cli/src/cli/core/templates.ts
    • packages/squad-cli/templates/workflows/squad-ci.yml
    • packages/squad-cli/templates/workflows/squad-docs.yml
    • packages/squad-cli/templates/workflows/squad-heartbeat.yml
    • packages/squad-cli/templates/workflows/squad-insider-release.yml
    • packages/squad-cli/templates/workflows/squad-issue-assign.yml
    • packages/squad-cli/templates/workflows/squad-label-enforce.yml
    • packages/squad-cli/templates/workflows/squad-preview.yml
    • packages/squad-cli/templates/workflows/squad-promote.yml
    • packages/squad-cli/templates/workflows/squad-release.yml
    • packages/squad-cli/templates/workflows/squad-triage.yml
    • packages/squad-cli/templates/workflows/sync-squad-labels.yml
    • packages/squad-sdk/src/build/ci-pipeline.ts
    • packages/squad-sdk/src/runtime/scheduler.ts
    • packages/squad-sdk/templates/workflows/squad-ci.yml
    • packages/squad-sdk/templates/workflows/squad-docs.yml
    • packages/squad-sdk/templates/workflows/squad-heartbeat.yml
    • packages/squad-sdk/templates/workflows/squad-insider-release.yml
    • packages/squad-sdk/templates/workflows/squad-issue-assign.yml
    • packages/squad-sdk/templates/workflows/squad-label-enforce.yml
    • packages/squad-sdk/templates/workflows/squad-preview.yml
    • packages/squad-sdk/templates/workflows/squad-promote.yml
    • packages/squad-sdk/templates/workflows/squad-release.yml
    • packages/squad-sdk/templates/workflows/squad-triage.yml
    • packages/squad-sdk/templates/workflows/sync-squad-labels.yml
    • .github/workflows/squad-workflow-lint.yml

    Reproduction / measurement

    Execution-tested command:

    git --no-pager grep -n "runs-on: ubuntu-latest\|actions/checkout@\|persist-credentials" -- packages\squad-cli\templates\workflows packages\squad-sdk\templates\workflows packages\squad-cli\src\cli\core\upgrade.ts packages\squad-sdk\src

    Relevant output excerpt:

    packages/squad-cli/src/cli/core/upgrade.ts:341:      '    runs-on: ubuntu-latest\n' +
    packages/squad-cli/src/cli/core/upgrade.ts:343:      '      - uses: actions/checkout@v4\n\n' +
    packages/squad-cli/templates/workflows/squad-ci.yml:15:    runs-on: ubuntu-latest
    packages/squad-cli/templates/workflows/squad-ci.yml:17:      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 #v4
    packages/squad-sdk/src/build/ci-pipeline.ts:118:  lines.push('    runs-on: ubuntu-latest');
    packages/squad-sdk/src/build/ci-pipeline.ts:120:  lines.push('      - uses: actions/checkout@v4');
    packages/squad-sdk/src/runtime/scheduler.ts:724:        `    runs-on: ubuntu-latest`,
    packages/squad-sdk/src/runtime/scheduler.ts:726:        `      - uses: actions/checkout@v4`,
    

    No persist-credentials matches were returned by that command.

    Verification bar

    The design/implementation should add tests that fail against today’s hardcoded behavior and pass only when:

    • CLI init and upgrade honor both scalar and array runs-on config values.
    • Non-npm stubs from generateProjectWorkflowStub honor the same runner and checkout-security policy.
    • SDK generateGitHubActionsWorkflow can emit the same runner and checkout-security policy as the CLI.
    • Generated checkout steps include persist-credentials: false by default, unless an explicitly validated policy says otherwise.
    • Validation rejects control characters and mutable checkout/action references wherever custom refs are accepted.

    Traps

    Out of scope

    Session-stall guard

    Before starting: this repo has phantom CRLF diffs (#1793). If git status shows files modified that you did not touch, run git diff --ignore-cr-at-eol. If that output is empty, the diff is line-ending churn, not real edits — run git add --renormalize . and continue. Do not halt and ask for confirmation; halting on phantom diffs is the documented cause of stuck sessions in this repo.

  3. bradygaster commented on Aug 30, 2026

    @bradygaster
    Collaborator

    Consolidation note (Ralph triage): Two completed/superseded issues are consolidated here to preserve their unresolved requirements:

    Both issues are being closed. This issue (#1502) is the authoritative tracker for runner selection, checkout version pinning, and upgrade-survival behavior.

  4. github-actions commented on Sep 10, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  5. 6 remaining items

  6. github-actions commented on Sep 11, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  7. github-actions commented on Sep 11, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  8. github-actions commented on Sep 11, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  9. github-actions commented on Sep 11, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  10. github-actions commented on Sep 13, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: architect
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  11. added
    squad:agentic-workflows-devAssigned to agentic-workflows-dev (Agentic Workflows Engineer)
    and removed
    squad:architectAssigned to architect (Lead Architect)
    on Sep 24, 2026
  12. github-actions commented on Sep 24, 2026

    @github-actions
    Contributor

    📋 Assigned to agentic-workflows-dev (Agentic Workflows Engineer)

    Issue: #1502 — [Cross-Squad] Make generated workflow runners and checkout security configurable

    agentic-workflows-dev will pick this up in the next Copilot session.

    For Copilot coding agent: If enabled, this issue will be worked automatically.
    Otherwise, start a Copilot session and say:
    agentic-workflows-dev, work on issue #1502

  13. added
    wave:1-nextWave 1 — immediate next sprint
    wave1:P10Wave 1 PR group P10
    and removed
    wave:2-soonWave 2 — next 2-4 weeks
    on Nov 5, 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

    go:needs-researchNeeds investigationpriority:p2Next sprintsquadSquad triage inbox — Lead will assign to a membersquad:agentic-workflows-devAssigned to agentic-workflows-dev (Agentic Workflows Engineer)triagedIssue has been triagedtype:rfcRFCwave1:P10Wave 1 PR group P10wave:1-nextWave 1 — immediate next sprintworkflows

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions