Summary
The managed examples/anomaly-triage.yml caller omits an explicit permissions block. Consumers whose repository default is a read-only GITHUB_TOKEN fail at workflow startup because the called reusable job requests pull-requests: write and issues: write.
Evidence
- Consumer:
ArchonVII/sales (default_workflow_permissions: read).
- Failed runs: https://github.com/ArchonVII/sales/actions/runs/29062244365 and https://github.com/ArchonVII/sales/actions/runs/29062294338.
- Both runs concluded
startup_failure with zero jobs and no logs.
sales/.github/workflows/anomaly-triage.yml matches github-workflows/examples/anomaly-triage.yml and declares no top-level permissions.
- The reusable workflow at
.github/workflows/anomaly-triage.yml@v1 requires contents: read, pull-requests: write, and issues: write for its triage job.
actionlint examples/anomaly-triage.yml is clean; this is a token-permission contract gap, not YAML syntax.
Reproduction
- Install
examples/anomaly-triage.yml in a repository whose Actions default workflow permissions are read-only.
- Open or update a PR that changes
.archon/anomalies-thispr.md.
- Observe the
Anomaly triage workflow fail before any job starts.
Expected behavior
The managed caller explicitly grants the least privileges required by the reusable workflow, and anomaly entries are routed to PR comments/issues.
Actual behavior
The workflow ends as startup_failure; anomalies are not routed and no diagnostic log is available.
Acceptance Criteria
Impact
Medium — off-task defects silently remain untracked in every read-default consumer using this managed caller. Required gates are unaffected, so feature PRs can merge while anomaly routing is broken.
Summary
The managed
examples/anomaly-triage.ymlcaller omits an explicit permissions block. Consumers whose repository default is a read-onlyGITHUB_TOKENfail at workflow startup because the called reusable job requestspull-requests: writeandissues: write.Evidence
ArchonVII/sales(default_workflow_permissions: read).startup_failurewith zero jobs and no logs.sales/.github/workflows/anomaly-triage.ymlmatchesgithub-workflows/examples/anomaly-triage.ymland declares no top-level permissions..github/workflows/anomaly-triage.yml@v1requirescontents: read,pull-requests: write, andissues: writefor its triage job.actionlint examples/anomaly-triage.ymlis clean; this is a token-permission contract gap, not YAML syntax.Reproduction
examples/anomaly-triage.ymlin a repository whose Actions default workflow permissions are read-only..archon/anomalies-thispr.md.Anomaly triageworkflow fail before any job starts.Expected behavior
The managed caller explicitly grants the least privileges required by the reusable workflow, and anomaly entries are routed to PR comments/issues.
Actual behavior
The workflow ends as
startup_failure; anomalies are not routed and no diagnostic log is available.Acceptance Criteria
contents: read,pull-requests: write,issues: write.actionlint.archon-setupsnapshot from the provider rather than editing the snapshot first.Impact
Medium — off-task defects silently remain untracked in every read-default consumer using this managed caller. Required gates are unaffected, so feature PRs can merge while anomaly routing is broken.