Conversation
…refine PR review conditions - remove forks support from PR review workflow - add conditions to skip review for forked PRs and bot authors - update all workflows to use the latest upload-artifact version 🔧 - Generated by Copilot Co-authored-by: Copilot <[email protected]> Signed-off-by: Marcel Bindseil <[email protected]>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1421 +/- ##
==========================================
- Coverage 87.92% 87.64% -0.29%
==========================================
Files 62 61 -1
Lines 9593 9325 -268
==========================================
- Hits 8435 8173 -262
+ Misses 1158 1152 -6
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Advisory review, this PR is from a maintainer. Findings are informational only.
Review Summary
This is a well-scoped bug-fix PR that addresses three regression-class security-model failures in the agentic CI workflows, plus a repo-wide version-comment normalization. All linked issues are addressed. CI validation passes across the full suite of relevant checks. No blocking concerns identified.
Issue Alignment ✅
All four linked issues are directly addressed:
| Issue | Fix | Verified |
|---|---|---|
#1368 — Fork PRs crash pr-review |
Removed forks: ["*"] from pr-review.md; compiler emits fork guard on activation and pre_activation job if: conditions |
✅ |
#1367 — Dependabot workflow-file PRs fail dependency-pr-review |
Removed .github/workflows/*.yml from on.pull_request.paths in dependency-pr-review.md |
✅ |
| #1369 — Bot-author short-circuit hardened | Added github.event.pull_request.user.login check to pr-review.md Activation Guard |
✅ |
WI-06 — upload-artifact version comment normalization |
27 hand-authored workflows updated; 5 lock files recompiled | ✅ |
No scope creep detected. Changes are narrowly scoped to the stated problems.
PR Template Compliance ⚠️ (minor, advisory)
The description, related issues, type of change, testing narrative, and security considerations sections are all exemplary. One minor observation:
Several Required Automated Checks are unchecked without explicit N/A annotations: spell-check, lint:md-links, lint:ps, plugin:generate, docs:test. For a workflow-only PR that touches no markdown prose, PowerShell scripts, or plugin manifests, these are legitimately not applicable — but marking them as N/A (or adding a brief note like was done for validate:skills and documentation) would improve audit clarity for future reviewers scanning the checklist. This is a minor polish item with no impact on correctness.
Coding Standards ✅
Changes to .github/workflows/*.yml files were reviewed against the GitHub Actions workflow instructions:
- Dependency pinning: All actions remain pinned to full commit SHAs. The
actions/upload-artifactSHA043fb46d1a93c77aae656e7c1c64a875d1fc6a0ais unchanged; only the trailing# v7 → # v7.0.1version comment was updated.lint:dependency-pinningreports 100% compliance. ✅ - Permissions: No
permissions:blocks were added or removed; existing least-privilege posture preserved. ✅ - Generated files: Lock files correctly carry the
DO NOT EDITheader and are driven by recompilation; direct edits were not made. ✅ - YAML expression quoting: The folded block scalar (
>) used for the fork-guardif:condition inpr-review.lock.ymlis the correct pattern for multi-clause conditions and avoids the colon-space YAML parse hazard. ✅
Code Quality and Security ✅
Fork guard logic (pr-review.lock.yml):
if: >
needs.pre_activation.outputs.activated == 'true' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.id == github.repository_id)The condition is correct: it short-circuits at the activation job boundary before secrets are needed. The github.event_name != 'pull_request' clause ensures the guard only fires on pull_request events, preserving workflow_dispatch and other manual triggers.
Path filter removal (dependency-pr-review.md): Cleanly prevents workflow-file-only PRs from triggering the workflow at the platform level — the right layer for this fix.
Defense-in-depth: Adding the fork guard bullet to dependency-pr-review.md's Activation Guard is technically redundant now that the path filter prevents workflow-file-only PRs from triggering the workflow. However, this is intentional defense-in-depth and a good practice for resilience against future path-filter changes.
Bot-author guard: The github.event.pull_request.user.login check correctly targets the PR author rather than the event actor (github.actor), closing the maintainer-triggered bypass described in #1369.
Attack surface: This PR is monotonically restrictive — no permissions were broadened, no new secrets were exposed, and two previously reachable failure paths (fork secret-strip crash, bot-skip actor bypass) are now unreachable.
Advisory Observations
-
WI-01 follow-up (
doc-update-check.md,issue-triage.md): The corresponding.mdsource files for these two lock files are not modified in this PR. As documented, WI-01 tracks auditing these for the bot-author bypass pattern. The lock files in this PR only received version-comment normalization. This is the correct scoping decision. -
Commit message mismatch: The PR's suggestion to use
fix(workflows): close fork-PR/workflow-file-PR secret-strip gap and normalize upload-artifact version (#1365)as the squash-merge commit message is a good recommendation — the current commit subject does not capture the security significance of the changes. -
Runtime verification deferred (WI-05): Post-deploy verification across maintainer, fork-contributor, and Dependabot PR classes is reasonable to defer. The static analysis confirms the logic is correct; live verification is the prudent next step after merge.
Verdict
No blocking issues. The PR is well-engineered, well-documented, and reduces the agentic workflow attack surface. Recommend merge after the maintainer is satisfied with the advisory observations above.
WilliamBerryiii
left a comment
There was a problem hiding this comment.
✅ Approve with minor suggestions (no blockers)
Reviewed PR #1421 against the three independent moving parts of the fork / secret-strip remediation:
- LLM-side Activation Guard in
pr-review.mdanddependency-pr-review.md— explicitnoopinstructions for fork PRs. - Compiler-side
if:injection via the gh-aw v0.68.1 → v0.68.3 bump that regenerates 5.lock.ymlfiles withif: github.event_name != 'pull_request' || github.event.pull_request.head.repo.id == github.repository_idonpre_activationand downstream jobs (this is the primary defense; the prompt guard is defense-in-depth). - Path filter trim in
dependency-pr-review.mdremoving'.github/workflows/*.yml'fromon.pull_request.paths.
All three changes are surgical and correct. The 44 KB dependency-pr-review.lock.yml diff is fully accounted for by the documented compiler cascade — no unintended drift.
Risk summary
| Risk Area | Assessment |
|---|---|
| Functional correctness | ✅ Compiler-injected if: is the primary fork guard; LLM prompt is defense-in-depth |
| Security | gh-aw-actions/setup v0.68.3 release notes (see inline RI-6) |
| Operational visibility | |
| Convention compliance | ✅ Renovate patch-level convention satisfied across 27 workflows |
| Reviewability | 💡 Diff size inflated by mechanical normalization — acceptable here |
General notes (no specific file anchor)
RI-7 🔍 Closes-mapping verification. PR closes #1365 (epic), #1367, #1368, #1369. Mapping for the epic is clear. Worth a quick check that each of #1367 / #1368 / #1369 has a corresponding change visible in the diff — if any describe a separate symptom not covered here, split the closes-target rather than auto-closing on merge.
RI-5 💡 Process note for future PRs. 27 of 35 changed files are pure comment normalizations (# v7 → # v7.0.1). Bundling them with the substantive fix is acceptable here because the consistency lint runs on the same branch and would fail otherwise. In future, a separate "mechanical" PR for Renovate-convention normalizations would keep substantive review surface tighter. Not a blocker.
RI-4 ✅ # v7 → # v7.0.1 normalization. Confirmed across all 27 workflows: SHA 043fb46d1a93c77aae656e7c1c64a875d1fc6a0a is unchanged on every touched line; only the trailing version comment moves. This satisfies the Renovate-style patch-level convention enforced by scripts/security/Test-ActionVersionConsistency.ps1 and matches the manifest entry the gh-aw compiler resolves into the regenerated .lock.yml files ({"repo":"actions/upload-artifact","sha":"043fb46d…","version":"v7.0.1"}). No change requested.
Recommended next steps
- Author: respond to inline RI-3 (acknowledge manual-review gap, optionally open follow-up issue) and RI-6 (cite upstream
github/gh-aw-actionsv0.68.3 release notes in the PR description). - Author: optional — pick up the clarifying comment from RI-1.
- Reviewer: spot-verify the SHA
ba90f2186d7ad780ec640f364005fa24e797b360against the upstreamgithub/gh-aw-actionsv0.68.3 tag.
Once RI-3 and RI-6 are acknowledged, this is ready to merge. Approving now since none of the seven items are blockers.
Reviewed via the pr-review skill against head SHA b398d865. Full handoff and supporting artifacts in .copilot-tracking/pr/review/bug-agentic-workflow-forks/.
…t workflow PRs - pr-review.md: clarify that dependabot[bot] is skipped because dependency-pr-review owns automated review for dependency bumps (RI-1). - CONTRIBUTING.md: document that Dependabot PRs bumping action SHAs inside .github/workflows/*.yml require manual maintainer review because GitHub strips secrets from workflow-file PRs (RI-3).
|
Thanks for the review @WilliamBerryiii — addressed in d5ff757: RI-1 (bot-guard asymmetry): Added a clarifying sentence to the RI-3 (dependency-pr-review paths trim): Added a new Dependabot Pull Requests section in RI-6 (
RI-2 ( No functional workflow changes beyond the two docs edits; |
There was a problem hiding this comment.
Advisory review — this PR is from a maintainer. Findings are informational only.
Overview
This PR closes a well-documented triple-regression in the agentic workflow security boundary and performs a mechanical normalization of upload-artifact version comments following a gh aw compiler upgrade. The changes are precise, well-motivated, and backed by a thorough RPI trace. All four linked issues are addressed.
Issue Alignment ✅
| Issue | Requirement | Addressed |
|---|---|---|
| #1365 (epic) | All three problems resolved | ✅ |
| #1367 | Remove .github/workflows/*.yml from dependency-pr-review.md paths |
✅ |
| #1368 | Fork-PR detection in pr-review.md Activation Guard + compiled job condition |
✅ |
| #1369 | PR-author bot-skip in pr-review.md Activation Guard (partial — see inline note) |
✅ (documented partial) |
The acceptance criteria for #1368 are satisfied at both the agent-instruction layer and at the compiled workflow level — pre_activation and activation both gate on github.event.pull_request.head.repo.id == github.repository_id. The Validate COPILOT_GITHUB_TOKEN secret step can no longer be reached from a fork PR context.
PR Template Compliance ✅ (one advisory item)
- Description: well-written; summarises all four changes with implementation rationale.
- Related Issues: all four linked with proper close keywords.
- Type of Change: "Bug fix" and "GitHub Actions workflow" are correctly checked; the
CONTRIBUTING.mdprose addition might arguably warrant "Documentation update" as a third check, though the omission is defensible since it is incidental to the workflow fix. - Testing: comprehensive validation table with explicit deferred items and rationale.
- Security: accurately describes the monotonically-restrictive posture.
- Advisory:
npm run spell-checkis unchecked without an N/A annotation. The workflow files don't need spell-check, butCONTRIBUTING.mdwas updated with new prose. See inline comment.
Coding Standards ✅
All workflow files follow the repository's pinning convention. The actions/upload-artifact SHA (043fb46d...) is unchanged; only the trailing comment was updated from # v7 to # v7.0.1, which is correct per lint:version-consistency. The gh-aw-actions/setup bump is reflected in actions-lock.json and all five compiled lock files.
One observation from the lock-file manifest diff: actions/github-script@v9 previously used two different SHAs (373c709c... and 3a2844b7...). After recompile, only 373c709c... is used, consolidating the react step and the standard github-script step to the same SHA. This is expected compiler behavior (the v0.68.1 → v0.68.3 upgrade standardized the react step SHA) and is safe — both were valid @v9 pins.
Code Quality and Security ✅
- Fork guard placement: Correct. Both
pre_activation(the earliest gating job) andactivationcheckgithub.event.pull_request.head.repo.id == github.repository_id. The YAML>folded scalar inactivationavoids the colon-space YAML parsing hazard documented in the workflow conventions. - Path filter removal: Straightforward. Removing
.github/workflows/*.ymleliminates the only path that causeddependency-pr-reviewto trigger on secret-stripped PRs without broadening coverage elsewhere. - Bot-skip hardening: The agent-instruction layer is updated to check
github.event.pull_request.user.login. The residual gap (runtimecheck_skip_bots.cjsstill usesgithub.actor) is clearly tracked (WI-02) and acknowledged. See inline note onpr-review.mdline 69. CONTRIBUTING.md: The new "Dependabot Pull Requests" section is accurate, well-placed, and provides actionable guidance for maintainers handling workflow-file Dependabot bumps.
Follow-up Tracking (from PR)
The PR's WI-01 through WI-05 items are well-scoped. No additional items identified.
Two inline advisory comments posted. No blocking issues found.
## Pre-Release 3.3.101 ### ✨ Features - add removed maturity tier and retire owasp-docker (#1444) - add evaluation dataset creator (#1279) - align RAI planner with guide, remove scoring, improve UX (#1287) - add PSGallery staleness check and BOM cleanup (#1379) - ISA-95 network planner agent (#1177) - auto-generate collection.md with maturity filtering (#1316) - add folder-consistency check and standardize WARN outp… (#1350) - add synth-data-generate prompt to data-science collection (#1419) - add canonical deck workflow and customer-card rendering for design thinking (#1413) - add Figma MCP integration for DT artifact export (#1222) - introduce `owasp-docker` (#1245) - replace hve-core-specific references with portable discovery-based language (#1335) - introduce `owasp-cicd` (#1246) - add secure-by-design knowledge skill (#1223) - introduce `owasp-infrastructure` (#1244) - introduce `owasp-mcp` (#1207) - add OutputPath parameter to Invoke-LinkLanguageCheck.ps1 (#1229) - add -OutputPath parameter to Validate-SkillStructure.ps1 (#1225) - add maintainer-only skip-review label guard (#1293) - add extension collections overview and integrate into getting started flow (#950) - add agentic workflows for automated issue triage, implementation, PR review, dependency review, and doc-staleness detection (#1219) - consolidate package-lock.json version sync into Update-VersionFiles.ps1 (#1240) - add standards code review agent and full review orchestrator (#1174) - standardize pytest-mock as Python mocking framework (#1170) - add Jira backlog workflows and Jira/GitLab skills (#978) - add centralized version bump script and supply-chain attestation (#1183) ### 🐛 Bug Fixes - pin PowerShell-Yaml to 0.4.7 across all install sites (#1378) - close fork-PR/workflow-file-PR secret-strip gap and normalize upload-artifact version (#1421) - replace stream-based lookahead with array indexing in list-changed-files.sh (#1376) - centralize ISO 8601 timestamp regex in CIHelpers (#1343) - update stale documentation date in release-process.md (#1363) - pin basic-ftp to 5.3.0 to resolve GHSA-rp42-5vxx-qpwr (#1374) - add bot filter to dependency PR review workflow (#1362) - resolve pip-audit findings in powerpoint, gitlab, and jira skill lock files (#1360) - standardize Timestamp JSON key casing across all lint result files (#1314) - add synchronize trigger to PR Review workflow (#1323) - standardize timestamp in Validate-SkillStructure.ps1 to use Get-StandardTimestamp (#1280) - add parallel subagent dispatch and structured JSON contracts to code-review-full (#1304) - standardize timestamp in SecurityHelpers.psm1 to use Get-StandardTimestamp (#1284) - standardize timestamps in Test-DependencyPinning.ps1 and SecurityClasses.psm1 (#1282) - derive collection artifact counts from YAML at build time (#1275) - standardize timestamp in FrontmatterValidation.psm1 to use Get-StandardTimestamp (#1285) - standardize timestamp in Markdown-Link-Check.ps1 to use Get-StandardTimestamp (#1283) - escape hyphens in Mermaid diagram on Collections page (#1262) - add summary timestamp to PSScriptAnalyzer output (#1211) - fix plugin compatibility and robustness for coding-standards code review agents (#1289) - standardize timestamp in Test-CopyrightHeaders.ps1 to use Get-StandardTimestamp (#1278) - standardize timestamp in Invoke-YamlLint.ps1 to use Get-StandardTimestamp (#1270) - standardize timestamp in Invoke-LinkLanguageCheck.ps1 to use Get-StandardTimestamp (#1264) - fix dependency-review path filters and sparse-checkout cone mode (#1259) - replace invalid bare tool names with official tool identifiers (#1198) - fix broken links and remove orphaned reference in code review docs (#1257) - exclude Python env dirs from skill validation warnings (#1255) - pin happy-dom and serialize-javascript to resolve Dependabot vulnerabilities (#1253) - remove Mermaid diagram and add missing collection cards (#1247) - disable MCP servers by default to prevent token limit errors (#1144) - sync package-lock.json after pre-release version bump (#1236) - separate mermaid node declarations and add dynamic diagram generation with tests (#1215) - replace anchor links in meeting-analyst with bold text references (#1201) - remove recursive symlinks in jira and gitlab skill directories (#1233) - validate-installation scripts now check .github/skills directory (#1010) (#1206) - resolve npm audit vulnerabilities via dependency overrides (#1200) - add post-release triggers to scorecard workflow (#1186) - add missing .md extensions to relative links in agent documentation (#1180) ### 📚 Documentation - broaden Security Review description beyond OWASP (#1385) - document maintainer advisory mode and skip-review label guard (#1386) - document ExcludePaths/OutputPath for Invoke-LinkLanguageCheck (#1383) - CLI getting-started: clarify plugin install commands as alternatives (-all vs base) (#1251) ### ♻️ Refactoring - align agent and prompt folder names to collection identifier (#1210) ### 🔧 Maintenance - pin PSScriptAnalyzer to 1.25.0 and sync stale workflow version comments (#1389) - bump lxml from 6.0.2 to 6.1.0 in /.github/skills/experimental/powerpoint (#1424) - bump @vscode/vsce from 3.7.1 to 3.9.1 in the npm-dependencies group (#1390) - bump the github-actions group across 1 directory with 7 updates (#1391) - bump follow-redirects from 1.15.11 to 1.16.0 in /docs/docusaurus (#1356) - upgrade Node.js from 20 to 24 and bump cspell to v10 (#1353) - bump basic-ftp from 5.2.0 to 5.2.1 (#1324) - update github/gh-aw-actions requirement to 536ea1bad8c6715d098a9dc1afea8d403733acfe in the github-actions group across 1 directory (#1298) - update security instruction attributions and compliance (#1294) - bump the npm-dependencies group with 2 updates (#1297) - pre-release 3.3.41 (#1252) - streamline RAI Planner phase structure and documentation (#1273) - bump happy-dom from 20.8.8 to 20.8.9 in /docs/docusaurus (#1237) - pre-release 3.3.27 (#1191) - bump pygments from 2.19.2 to 2.20.0 in /.github/skills/gitlab/gitlab (#1234) - bump path-to-regexp from 0.1.12 to 0.1.13 in /docs/docusaurus (#1226) - bump the github-actions group with 4 updates (#1231) - add missing folders and alphabetize location lists (#1193) - bump brace-expansion (#1224) - bump handlebars from 4.7.8 to 4.7.9 in /docs/docusaurus (#1217) - bump brace-expansion from 5.0.3 to 5.0.5 in /docs/docusaurus (#1213) - pre-release 3.3.10 (#1187) - bump markdownlint-cli2 from 0.21.0 to 0.22.0 in the npm-dependencies group (#1175) - bump the github-actions group with 3 updates (#1176) - pre-release 3.3.1 (#1165) --- *Managed automatically by pre-release workflow.* Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Pull Request
Description
Fixes three regression-class bugs in the repository's agentic PR-review workflows and normalizes the repo-wide
actions/upload-artifactversion comment to match the upgradedgh awcompiler's output.What changed:
pr-review(#1368).forks: ["*"]was removed frompr-review.mdfrontmatter sogh aw compileauto-emits an activation-job-level fork guard (github.event.pull_request.head.repo.id == github.repository_id). Fork PRs now short-circuit at theactivationandpre_activationjobs before theValidate COPILOT_GITHUB_TOKEN secretstep runs — the step that was failing because GitHub strips secrets from fork PRs.dependency-pr-review(#1367). Removed.github/workflows/*.ymlfromon.pull_request.paths:. GitHub strips secrets from workflow-file PRs on the same security model as forks; this path-filter entry caused the workflow to activate without the token it needs.#1369). Added an Activation Guard bullet that referencesgithub.event.pull_request.user.loginfordependabot[bot]andgithub-actions[bot]. Documents the intent that complements the runtimecheck_skip_bots.cjscheck (which matchesgithub.actor) — once the agentic runtime stops erroneously matching ongithub.actorupstream.gh-aw-actions/setupwas bumpedv0.68.1 → v0.68.3, which caused the compiler to emit# v7.0.1version comments onactions/upload-artifact@043fb46d…. Updated 27 hand-authored workflows and recompiled 5 lock files solint:version-consistencystays clean. The underlying SHA is unchanged — only the trailing version comment was updated.See the changes log and review log for the full RPI + review record.
Related Issue(s)
Type of Change
Code & Documentation:
Infrastructure & Configuration:
AI Artifacts:
prompt-builderagent and addressed all feedback.github/instructions/*.instructions.md).github/prompts/*.prompt.md).github/agents/*.agent.md).github/skills/*/SKILL.md)Other:
.ps1,.sh,.py)Sample Prompts (for AI Artifact Contributions)
Testing
Compile + validation pipeline (all passed):
gh aw compile(5 workflows)npm run lint:mdnpm run lint:yamlnpm run lint:frontmatternpm run lint:version-consistencynpm run lint:permissionsnpm run lint:dependency-pinningManual verification:
.github/workflows/pr-review.lock.ymlline 75 (activationjobif:) and line 1264 (pre_activationjobif:) both gate ongithub.event.pull_request.head.repo.id == github.repository_id.Validate COPILOT_GITHUB_TOKEN secretstep at line 141 only runs inside the gatedactivationjob..github/workflows/dependency-pr-review.lock.ymlline 79 has the propagated fork guard.Runtime verification: Deferred to WI-05 (post-deploy verification across maintainer, fork-contributor, and Dependabot PR classes). Cannot run locally against
secrets.COPILOT_GITHUB_TOKENresolution behavior.Checklist
Required Checks
AI Artifact Contributions
/prompt-analyzeto review contributionprompt-builderreviewRequired Automated Checks
The following validation commands must pass before merging:
npm run lint:mdnpm run spell-checknpm run lint:frontmatternpm run validate:skillsnpm run lint:md-linksnpm run lint:psnpm run plugin:generatenpm run docs:testSecurity Considerations
Security posture summary: This PR is monotonically restrictive to the agentic workflow attack surface.
pr-reviewno longer enters any post-activation job on fork PRs;dependency-pr-reviewno longer triggers on workflow-file-only PRs. Neither change broadens privileges.github/gh-aw-actions/setupv0.68.1 → v0.68.3andactions/github-script@v9 to the latest tag SHA). SHA pinning preserved (lint:dependency-pinning100%).permissions:blocks modified; no newsafe-outputsadded.Validate COPILOT_GITHUB_TOKEN secretcould log a predictable failure string from an unauthenticated fork — previously benign but now impossible.Additional Notes
Commit subject caveat: The branch carries a single commit whose subject (
chore(workflows): update upload-artifact action to version 7.0.1 and refine PR review conditions) under-represents the PR's scope. If the reviewer squash-merges, the recommended merge commit subject is:Follow-up tracking (from the planning log):
doc-update-check.mdandissue-triage.mdfor the same bot-author bypass pattern.github/gh-aw-actionsproposingcheck_skip_bots.cjsalso matchpull_request.user.login.skip-forks: truefrontmatter option togh aw.