fix: set GH_AW_WORKFLOW_SOURCE_URL for local workflows in failure issues#34090
Merged
Conversation
Local workflows (no external `source:` frontmatter field) never had
GH_AW_WORKFLOW_SOURCE_URL set, causing `handle_agent_failure.cjs` to
fall back to `"#"`. This made the Workflow link in failure issue bodies
point to the issue itself instead of the workflow source file.
- Add buildLocalWorkflowSourceURL() to derive a GitHub URL from the
markdown path using ${{ github.server_url }}, ${{ github.repository }},
and ${{ github.ref_name }} expressions
- Modify buildWorkflowMetadataEnvVars/WithTrackerID to accept a
localSourceURL fallback used when workflowSource is empty
- Update all callers (notify_comment.go, safe_outputs_env.go,
compiler_safe_outputs_job.go) to pass the local URL
- Recompile all 229 local workflows to apply the fix
Co-authored-by: pelikhan <[email protected]>
Copilot created this pull request from a session on behalf of
pelikhan
May 22, 2026 18:56
View session
Contributor
There was a problem hiding this comment.
Pull request overview
This PR fixes missing GH_AW_WORKFLOW_SOURCE_URL emission for local workflows (no external source: frontmatter), ensuring failure-issue bodies link to the workflow markdown file instead of falling back to "#".
Changes:
- Add
buildLocalWorkflowSourceURL(markdownPath)to derive a repo blob URL for local workflow markdown files. - Extend workflow metadata env-var builders to accept a
localSourceURLfallback whenworkflowSourceis empty, and plumb it through compiler call sites. - Recompile workflow lock files so
GH_AW_WORKFLOW_SOURCE_URLis present inhandle_agent_failure/safe-outputs contexts.
Show a summary per file
| File | Description |
|---|---|
| pkg/workflow/frontmatter_extraction_metadata.go | Add helper to derive local workflow source blob URL from markdown path. |
| pkg/workflow/frontmatter_extraction_metadata_test.go | Add unit tests covering local URL derivation behavior. |
| pkg/workflow/safe_outputs_env.go | Add localSourceURL fallback for GH_AW_WORKFLOW_SOURCE_URL when no external source is set. |
| pkg/workflow/safe_output_helpers_test.go | Expand tests to cover local URL fallback and precedence rules. |
| pkg/workflow/safe_outputs_test.go | Update tests for new buildWorkflowMetadataEnvVarsWithTrackerID signature. |
| pkg/workflow/compiler_safe_outputs_job.go | Populate GH_AW_WORKFLOW_SOURCE_URL at job level for local workflows. |
| .github/workflows/workflow-normalizer.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/workflow-generator.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/video-analyzer.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/update-astro.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/unbloat-docs.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/typist.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/tidy.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/test-workflow.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/test-quality-sentinel.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/test-project-url-default.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/test-dispatcher.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/terminal-stylist.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/super-linter.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/step-name-alignment.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/static-analysis-report.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/stale-pr-cleanup.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/spec-extractor.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/spec-enforcer.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-test-tools.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-project.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-pi.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-opencode.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-gemini.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-crush.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-claude.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/smoke-ci.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/sergo.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/semantic-function-refactor.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/security-review.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/security-compliance.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/scout.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/schema-consistency-checker.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/safe-output-health.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/research.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/repo-tree-map.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/release.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/refiner.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/q.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/pr-triage-agent.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/pr-sous-chef.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/pr-description-caveman.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/pr-code-quality-reviewer.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/plan.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/pdf-summary.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/outcome-collector.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/metrics-collector.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/mergefest.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/mcp-inspector.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/linter-miner.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/lint-monster.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/issue-monster.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/instructions-janitor.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/hourly-ci-cleaner.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/hippo-embed.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/gpclean.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/go-pattern-detector.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/go-logger.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/go-fan.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/glossary-maintainer.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/firewall.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/example-workflow-analyzer.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/example-permissions-warning.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/draft-pr-cleanup.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/dictation-prompt.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/dev.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/dev-hawk.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/deployment-incident-monitor.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/dependabot-worker.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/delight.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/dead-code-remover.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/daily-regulatory.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/daily-malicious-code-scan.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/daily-cli-performance.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/daily-choice-test.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/craft.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/copilot-opt.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/copilot-agent-analysis.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/contribution-check.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/codex-github-remote-mcp-test.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/code-simplifier.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/cloclo.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/cli-version-checker.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/ci-coach.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/changeset.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/brave.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/bot-detection.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/blog-auditor.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/artifacts-summary.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/architecture-guardian.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/archie.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/approach-validator.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/ai-moderator.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
| .github/workflows/ace-editor.lock.yml | Emit GH_AW_WORKFLOW_SOURCE_URL for local workflow failure/metadata env. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 236/236 changed files
- Comments generated: 1
Comment on lines
+200
to
+202
| url := fmt.Sprintf("${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/%s", relPath) | ||
| frontmatterMetadataLog.Printf("Built local workflow source URL for %s", relPath) | ||
| return url |
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.
Local workflows (no external
source:frontmatter) never hadGH_AW_WORKFLOW_SOURCE_URLemitted by the compiler, sohandle_agent_failure.cjsfell back to"#"— producing[Linter Miner](#)in failure issue bodies, a link pointing to the issue itself.External workflows (e.g.
ci-doctor,dependabot-repair) were unaffected because they already have a pinned external source URL.Changes
frontmatter_extraction_metadata.go— newbuildLocalWorkflowSourceURL(markdownPath)that builds a GitHub blob URL from the local markdown path using runtime expressions:safe_outputs_env.go—buildWorkflowMetadataEnvVars/buildWorkflowMetadataEnvVarsWithTrackerIDaccept a newlocalSourceURLparameter used as fallback whenworkflowSourceis emptynotify_comment.go,compiler_safe_outputs_job.go— all call sites passbuildLocalWorkflowSourceURL(c.markdownPath)handle_agent_failurestep now includes the correctGH_AW_WORKFLOW_SOURCE_URL; 5 external-source workflows unchanged