You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Parent hardening: #348
Related programme: #333
Execution mode: implementation
Depends on: #348
Blocks: #357
Bug Summary
Forge uses mutable GitHub Action release tags in workflows that provide repository, security and merge-gate evidence, even though the trusted MCP host-boundary workflow already uses exact commit-SHA pins.
Current Behaviour
Examples include actions/checkout@v7.0.0, actions/setup-node@v6.4.0 and actions/upload-artifact@v7.0.1 in normal CI/agent/issue workflows. By contrast, mcp-host-boundary-trusted.yml pins checkout to an immutable commit SHA with a readable version comment.
Once #348 makes Web CI/PR Contract required merge gates, mutable Action refs are part of the repository trust root.
Expected Behaviour
External Actions used by required, privileged, repository-write, issue-command, release or security workflows are pinned to exact immutable commit SHAs with readable version comments and a reviewed update path. Prefer applying the rule repository-wide for consistency.
Reproduction Steps
Search .github/workflows/*.yml for external uses: references.
Observe required/agent/issue workflows using @v* mutable tags.
Compare with the already SHA-pinned trusted host-boundary workflow.
Impact
A required check is only as trustworthy as the code it executes. Mutable refs allow upstream action identity to change without a Forge repository commit, weakening reproducibility and the supply-chain boundary #348 establishes.
Severity
High - supply-chain weakness in required/privileged repository workflows.
Inventory every external uses: — action owner/repo, current release tag, immutable SHA, permissions/event context and artifact/network behavior.
Resolve trusted immutable SHAs — use official upstream release/tag/commit metadata; preserve readable # vX.Y.Z comments. Do not guess SHA values.
Pin required/privileged workflows first — Web CI, PR Contract, agent command/dispatch/handoff, issue intake and artifact actions; extend repository-wide unless a documented exception exists.
Least-privilege pass — while touching each workflow, re-evaluate permissions:, checkout credential persistence, fork/untrusted-event execution and writable token exposure; do not broaden permissions.
Policy test — parse .github/workflows/*.yml and fail if an external action ref is not a full immutable commit SHA unless present in a tiny explicit reviewed allowlist.
Update path — configure/review Dependabot github-actions or document equivalent reviewed pin-update procedure; updates must show old/new SHA + version.
Updating third-party Action code or forking Actions unless a separately proven need arises.
General npm/container dependency pinning outside GitHub Action uses: references.
Broad CI redesign unrelated to immutable identity/least privilege.
Implementation Scope
Medium - workflow supply-chain/permission hardening plus one policy guard; target 2-3 small PRs or one tightly reviewed workflow PR if change volume remains mechanical.
Environment
Repository: Joncallim/Forge.
Baseline: current main after ADR 0014.
Reference pattern: exact checkout SHA already used by mcp-host-boundary-trusted.yml.
Technical Notes
This issue owns external Action identity and workflow-permission hardening only. Do not fold #348 ruleset policy or #357 external controller/host provisioning into the same change.
Parent hardening: #348
Related programme: #333
Execution mode: implementation
Depends on: #348
Blocks: #357
Bug Summary
Forge uses mutable GitHub Action release tags in workflows that provide repository, security and merge-gate evidence, even though the trusted MCP host-boundary workflow already uses exact commit-SHA pins.
Current Behaviour
Examples include
actions/checkout@v7.0.0,actions/setup-node@v6.4.0andactions/upload-artifact@v7.0.1in normal CI/agent/issue workflows. By contrast,mcp-host-boundary-trusted.ymlpins checkout to an immutable commit SHA with a readable version comment.Once #348 makes Web CI/PR Contract required merge gates, mutable Action refs are part of the repository trust root.
Expected Behaviour
External Actions used by required, privileged, repository-write, issue-command, release or security workflows are pinned to exact immutable commit SHAs with readable version comments and a reviewed update path. Prefer applying the rule repository-wide for consistency.
Reproduction Steps
.github/workflows/*.ymlfor externaluses:references.@v*mutable tags.Impact
A required check is only as trustworthy as the code it executes. Mutable refs allow upstream action identity to change without a Forge repository commit, weakening reproducibility and the supply-chain boundary #348 establishes.
Severity
High - supply-chain weakness in required/privileged repository workflows.
Implementation Sequence
uses:— action owner/repo, current release tag, immutable SHA, permissions/event context and artifact/network behavior.# vX.Y.Zcomments. Do not guess SHA values.permissions:, checkout credential persistence, fork/untrusted-event execution and writable token exposure; do not broaden permissions..github/workflows/*.ymland fail if an external action ref is not a full immutable commit SHA unless present in a tiny explicit reviewed allowlist.github-actionsor document equivalent reviewed pin-update procedure; updates must show old/new SHA + version.Primary Code / Control Seams To Inspect First
.github/workflows/*.yml.github/dependabot.ymlor equivalent update configuration if presentweb/__tests__/ scriptsOrthogonal Checkpoints
Acceptance Criteria
@v*,@main,@master, etc.).Out of Scope
uses:references.Implementation Scope
Medium - workflow supply-chain/permission hardening plus one policy guard; target 2-3 small PRs or one tightly reviewed workflow PR if change volume remains mechanical.
Environment
Joncallim/Forge.mainafter ADR 0014.mcp-host-boundary-trusted.yml.Technical Notes
This issue owns external Action identity and workflow-permission hardening only. Do not fold #348 ruleset policy or #357 external controller/host provisioning into the same change.