fix(actions): isolate persistent runner Git config - #79
Merged
Conversation
Signed-off-by: rldyourmnd <danil@nddev.it.com>
rldyourmnd
enabled auto-merge
August 6, 2026 09:27
rldyourmnd
disabled auto-merge
August 6, 2026 09:27
Signed-off-by: rldyourmnd <danil@nddev.it.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
nddev-harnessescheck_workflow_contracts.pyci-workflowsself-caller with a runner input to selectubuntu-latestexplicitlyObserved consumer failure: a persistent self-hosted runner global
http.https://github.com/.extraheadercombined with the token configured byactions/checkout, causing GitHub HTTP 400Duplicate header: Authorization. The workflows now use an empty job-unique global config under$RUNNER_TEMP; they neither read nor mutate runner global config.Type of change
Threat-model note (required for workflow / permission changes)
The new pre-checkout step executes only immutable workflow-library code and consumes no caller content, credentials, or event text. It creates one mode-0600 empty file under the job-unique runner temp directory and exports only that path through
GITHUB_ENV. This removes ambient persistent-runner Git configuration from the checkout trust boundary while leavingactions/checkoutresponsible for its scoped token. Privileged-event ref guards remain first where required. Public self-callers now selectubuntu-latestexplicitly, preventing private-consumer defaults from routing public PR code to self-hosted infrastructure. No new network, secret, cache, artifact, or write surface is introduced.Permissions diff (required for workflow / permission changes)
No permissions change. Top-level
permissions: {}and every affected job retain their prior least-privilege scopes.Checklist
# vX.Y.Zversion comment.permissionspreserved.persist-credentials: falseremains on all affected checkouts.run:.actionlintpasses locally.zizmor --pedantichas no template-injection or unpinned findings (10 pre-existing low undocumented-permissions findings remain in unrelated workflows).CHANGELOG.mdupdated under[Unreleased].Verification
python3 scripts/validate_all.py— PASSactionlint— PASSuvx zizmor@1.26.1 --persona regular --min-severity low .github/workflows— no findingspython3 scripts/generate_docs.py --check— PASSgit diff --check— PASSTier impact
Caller API and permissions are backward compatible; consumers opt in only by pinning the final commit.