Problem
Pull requests from forks receive a read-only GITHUB_TOKEN, even when a pull_request workflow declares pull-requests: write. The performance and coverage workflows currently invoke marocchino/sticky-pull-request-comment before running their substantive work.
PR #521 reproduced the failure across all performance and coverage jobs:
- the workflow token had
PullRequests: read and Secret source: None;
- the initial sticky-comment step failed with
Resource not accessible by integration;
- normal benchmark/coverage steps were then skipped because the preceding step failed;
always() upload/comparison steps ran without metrics.json or lcov.info, producing cascading snapshot failures; and
- the final sticky-comment step failed with the same permission error.
The regular build, test, lint, and environment jobs passed, confirming that this was a fork-permission failure rather than a problem with the action pins in PR #521.
Security constraint
Fork workflows must remain untrusted and read-only:
- do not grant fork pull requests write access or repository secrets;
- do not use
pull_request_target to execute or otherwise consume untrusted pull-request code; and
- do not weaken the fail-closed behavior of the actual performance and coverage gates.
Tasks
- Detect fork pull requests before invoking PR-comment-writing actions.
- Skip both in-progress and final sticky-comment steps when the token cannot write, while allowing the benchmark/coverage work and snapshot comparisons to continue.
- Ensure comment publishing itself is non-gating: a comment API failure must not suppress or replace the underlying quality-gate result.
- Preserve sticky performance and coverage comments for same-repository pull requests.
- Keep reports available to fork contributors through job summaries and uploaded artifacts.
- Audit other
pull_request workflows for write operations with the same fork-token assumption.
Acceptance criteria
Reproduction
Problem
Pull requests from forks receive a read-only
GITHUB_TOKEN, even when apull_requestworkflow declarespull-requests: write. The performance and coverage workflows currently invokemarocchino/sticky-pull-request-commentbefore running their substantive work.PR #521 reproduced the failure across all performance and coverage jobs:
PullRequests: readandSecret source: None;Resource not accessible by integration;always()upload/comparison steps ran withoutmetrics.jsonorlcov.info, producing cascading snapshot failures; andThe regular build, test, lint, and environment jobs passed, confirming that this was a fork-permission failure rather than a problem with the action pins in PR #521.
Security constraint
Fork workflows must remain untrusted and read-only:
pull_request_targetto execute or otherwise consume untrusted pull-request code; andTasks
pull_requestworkflows for write operations with the same fork-token assumption.Acceptance criteria
Resource not accessible by integration.pull_request_target, expose secrets, or grant write permissions to untrusted fork code.Reproduction