Skip to content

Add --runner-guard to compile; wire into static-analysis-report workflow#25281

Merged
pelikhan merged 7 commits intomainfrom
copilot/add-runner-guard-arg-to-compile
Apr 8, 2026
Merged

Add --runner-guard to compile; wire into static-analysis-report workflow#25281
pelikhan merged 7 commits intomainfrom
copilot/add-runner-guard-arg-to-compile

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 8, 2026

Adds runner-guard (ghcr.io/vigilant-llc/runner-guard:latest Docker image) as a fourth static analysis tool alongside zizmor, poutine, and actionlint.

CLI

  • --runner-guard flag added to gh aw compile — runs ghcr.io/vigilant-llc/runner-guard:latest via Docker on generated .lock.yml files
  • RunnerGuard bool added to CompileConfig and the MCP compile tool schema
  • CheckAndPrepareDockerImages updated to handle runner-guard image pre-pull/availability checks (4th parameter)
gh aw compile --runner-guard
gh aw compile --zizmor --poutine --actionlint --runner-guard

Compile pipeline

  • runner_guard.go — new file mirroring poutine.go; runs Docker, parses runner-guard JSON (RGS-XXX findings), displays via console.CompilerError
  • runBatchRunnerGuard / RunRunnerGuardOnDirectory added to compile_batch_operations.go
  • Wired into both compileSpecificFiles and compileAllFilesInDirectory
  • Bug fix (latent): --poutine or --runner-guard without --zizmor previously silently skipped (both relied on lockFilesForZizmor being non-empty). Replaced with lockFilesForDirTools, populated whenever any directory-scoped tool is requested.
  • Bug fix (strict mode): exit code 1 from runner-guard now fails strict mode even when JSON parsing fails
  • Bug fix (path traversal): path guard now correctly allows paths like ..foo while still rejecting real parent traversal
  • Scan scope: runner-guard scans the compiled workflows directory, not the entire repo root

Static analysis workflow

  • static-analysis-report.md: removed the separate runner_guard job — runner-guard now runs via --runner-guard in the existing compile step alongside zizmor, poutine, and actionlint
  • Removed artifact upload/download steps that depended on the separate job; runner-guard findings are now included in /tmp/gh-aw/compile-output.txt
  • Docker pull/verify steps include runner-guard image (latest tag)
  • Report output changed from discussion to issue: Phase 5 now creates a GitHub issue (title prefix [static-analysis]) instead of a discussion, with close-older-issues: true so each daily run replaces the previous report issue
  • Runner-guard finding issues (Critical/High, max 3) also use the [static-analysis] title prefix

Tests

  • runner_guard_test.go: covers JSON parsing, severity→errorType mappings, score/grade display, line-0 defaulting, multiple findings, empty/invalid JSON, and path sanitization
  • docker_images_test.go: added TestCheckAndPrepareDockerImages_RunnerGuardImageDownloading with useRunnerGuard=true

…port workflow

- Add RunnerGuardImage constant (ghcr.io/vigilant-llc/runner-guard:v3.0.1)
- Add RunnerGuard bool to CompileConfig
- Create runner_guard.go with Docker-based implementation (mirrors poutine.go)
- Update CheckAndPrepareDockerImages to accept useRunnerGuard param
- Add runBatchRunnerGuard/RunRunnerGuardOnDirectory to compile_batch_operations
- Wire runner-guard into compile_pipeline.go (both compileSpecificFiles and compileAllFilesInDirectory)
- Fix lockFilesForDirTools to allow --poutine/--runner-guard without --zizmor
- Add --runner-guard flag to cmd/gh-aw/main.go
- Add runner-guard field to MCP compile tool schema
- Update static-analysis-report.md: use Docker for runner_guard job and add --runner-guard to compile step

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/40d94ea5-12ef-45f4-8336-71b9904b8ff4

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@pelikhan pelikhan marked this pull request as ready for review April 8, 2026 11:57
Copilot AI review requested due to automatic review settings April 8, 2026 11:57
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds runner-guard as an additional static analysis tool in the gh aw compile pipeline and wires it into the repository’s static analysis reporting workflow.

Changes:

  • Introduces --runner-guard flag / CompileConfig.RunnerGuard and runs runner-guard via Docker during compile.
  • Updates Docker image preparation logic to include the runner-guard image.
  • Updates the static-analysis-report workflow to run runner-guard via Docker and include it in the compile step.
Show a summary per file
File Description
pkg/cli/runner_guard.go New runner-guard Docker runner + JSON parsing and console reporting of findings
pkg/cli/mcp_tools_readonly.go Adds runner-guard arg to MCP compile tool schema and execution
pkg/cli/docker_images.go Adds RunnerGuardImage and extends image preparation checks
pkg/cli/docker_images_test.go Updates tests for new signature + constant assertion
pkg/cli/compile_pipeline.go Fixes dir-tool lockfile collection + runs runner-guard in batch mode
pkg/cli/compile_config.go Adds RunnerGuard to compile configuration
pkg/cli/compile_batch_operations.go Adds batch runner-guard directory operation
cmd/gh-aw/main.go Wires --runner-guard flag into CLI compile command
.github/workflows/static-analysis-report.md Switches runner-guard job to Docker image and includes runner-guard in compile invocation
.github/workflows/static-analysis-report.lock.yml Regenerated lockfile reflecting workflow changes

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 10/10 changed files
  • Comments generated: 5

Comment on lines +104 to +114
if errors.As(err, &exitErr) {
exitCode := exitErr.ExitCode()
runnerGuardLog.Printf("runner-guard exited with code %d (findings=%d)", exitCode, totalFindings)
// Exit code 1 typically indicates findings in the repository
if exitCode == 1 {
if strict && totalFindings > 0 {
return fmt.Errorf("strict mode: runner-guard found %d security findings - workflows must have no runner-guard findings in strict mode", totalFindings)
}
// In non-strict mode, findings are logged but not treated as errors
return nil
}
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In strict mode, an exit code of 1 is treated as “findings present”, but the strict failure condition currently depends on totalFindings from JSON parsing. If parsing fails (parseErr != nil), totalFindings will be 0 and strict mode will incorrectly pass even though runner-guard indicated findings via exit code. Consider treating exit code 1 as a strict-mode failure whenever strict is enabled (optionally include parseErr/stdout context in the error), regardless of whether JSON parsing succeeded.

Copilot uses AI. Check for mistakes.

// Check if the resolved path is within gitRoot to prevent path traversal
relPath, err := filepath.Rel(absGitRoot, absPath)
if err != nil || strings.HasPrefix(relPath, "..") {
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The path traversal guard uses strings.HasPrefix(relPath, ".."), which can incorrectly reject legitimate paths like "..foo" that are still within the repo. Prefer checking relPath == ".." or strings.HasPrefix(relPath, ".."+string(filepath.Separator)) (and the equivalent for the OS separator) to distinguish real parent traversal from filenames starting with dots.

Suggested change
if err != nil || strings.HasPrefix(relPath, "..") {
if err != nil || relPath == ".." || strings.HasPrefix(relPath, ".."+string(filepath.Separator)) {

Copilot uses AI. Check for mistakes.
Comment on lines +38 to +42
// runRunnerGuardOnDirectory runs the runner-guard taint analysis scanner on a directory
// containing workflows using the Docker image.
func runRunnerGuardOnDirectory(workflowDir string, verbose bool, strict bool) error {
runnerGuardLog.Printf("Running runner-guard taint analysis on directory: %s", workflowDir)

Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

runRunnerGuardOnDirectory takes workflowDir and the comment/log message imply the scan is scoped to that directory, but the Docker invocation always runs scan . from the repo root (/workdir). If the intent is to scan only the compiled workflows directory, pass workflowDir (relative to /workdir) to runner-guard (or set the container working directory to workflowDir) so the behavior matches the function contract.

Copilot uses AI. Check for mistakes.
Comment on lines +125 to +143
// parseAndDisplayRunnerGuardOutput parses runner-guard JSON output and displays findings.
// Returns the total number of findings found.
func parseAndDisplayRunnerGuardOutput(stdout string, verbose bool, gitRoot string) (int, error) {
if stdout == "" {
return 0, nil // No output means no findings
}

trimmed := strings.TrimSpace(stdout)
if !strings.HasPrefix(trimmed, "{") && !strings.HasPrefix(trimmed, "[") {
if len(trimmed) > 0 {
return 0, fmt.Errorf("unexpected runner-guard output format: %s", trimmed)
}
return 0, nil
}

var output runnerGuardOutput
if err := json.Unmarshal([]byte(stdout), &output); err != nil {
return 0, fmt.Errorf("failed to parse runner-guard JSON output: %w", err)
}
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New runner-guard parsing/formatting logic is introduced here, but there are no unit tests covering JSON parsing, severity→errorType mapping, and path sanitization behavior. There are existing tests for similar logic in pkg/cli/poutine_test.go; adding analogous tests for runner-guard would help prevent regressions and ensure strict/non-strict behaviors remain correct.

Copilot uses AI. Check for mistakes.
Comment on lines 129 to 137
SetMockImageAvailable(ActionlintImage, false)

// Simulate multiple images already downloading
SetDockerImageDownloading(ZizmorImage, true)
SetDockerImageDownloading(PoutineImage, true)

// Request all tools
err := CheckAndPrepareDockerImages(context.Background(), true, true, true)
err := CheckAndPrepareDockerImages(context.Background(), true, true, true, false)
if err == nil {
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CheckAndPrepareDockerImages gained a new useRunnerGuard parameter, but the tests currently only exercise it as false. Add at least one test case where useRunnerGuard is true (e.g., image downloading/available, Docker unavailable) to ensure runner-guard is included in the missing/downloading lists and error messages as intended.

See below for a potential fix:

	SetMockImageAvailable(RunnerGuardImage, false)

	// Simulate multiple images already downloading
	SetDockerImageDownloading(ZizmorImage, true)
	SetDockerImageDownloading(PoutineImage, true)
	SetDockerImageDownloading(RunnerGuardImage, true)

	// Request all tools, including runner-guard
	err := CheckAndPrepareDockerImages(context.Background(), true, true, true, true)
	if err == nil {
		t.Error("Expected error when images are downloading, got nil")
	}

	// Error should mention downloading images and runner-guard
	if err != nil {
		errMsg := err.Error()
		if !strings.Contains(errMsg, "downloading") && !strings.Contains(errMsg, "retry") {
			t.Errorf("Expected error to mention downloading and retry, got: %s", errMsg)
		}
		if !strings.Contains(errMsg, RunnerGuardImage) {
			t.Errorf("Expected error to mention runner-guard image %q, got: %s", RunnerGuardImage, errMsg)
		}

Copilot uses AI. Check for mistakes.
@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 8, 2026

@copilot merge main and recompile

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 8, 2026

@copilot review comments

- Resolve conflict in mcp_tools_readonly.go: use DockerUnavailableError from main
  while preserving RunnerGuard support from this branch
- Update docker_images_test.go for new test from main (5-param CheckAndPrepareDockerImages)
- Recompile all 182 workflow lock files

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/2051d7b9-f534-443a-8db5-11384d63688a

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 8, 2026

@copilot merge main and recompile

Done in 7d7cf8a. Merged main, resolved the conflict in mcp_tools_readonly.go (incorporating the DockerUnavailableError handling from main while keeping RunnerGuard support), and recompiled all 182 workflow lock files.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw UT/0DYpGQgIYdqonrev-parse (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw ota=5% yHigh=170M (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility get --local /home/REDACTED/.local/bin/git gpg.program (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 8, 2026

@copilot merge main, fix conflicts and recompile

- Fix strict mode: exit code 1 fails even when JSON parsing fails
- Fix path traversal guard: use == ".." and HasPrefix("../") to avoid
  rejecting legitimate "..foo" paths within the repo
- Fix Docker scan scope: pass workflowDir relative to gitRoot as scan
  target instead of always scanning "." (the full repo root)
- Add runner_guard_test.go: JSON parsing, severity→errorType mapping,
  path sanitization behavior
- Add docker_images_test.go test for useRunnerGuard=true (image downloading)

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/7ced1697-6262-4a36-8d0d-c66db06a819a

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 8, 2026

@copilot review comments

All review comments addressed in af745ca:

  • Strict mode exit code 1: now fails even when JSON parsing fails — the parse error is included in the failure message
  • Path traversal guard: changed to relPath == ".." || strings.HasPrefix(relPath, ".."+string(filepath.Separator)) so ..foo paths are no longer incorrectly rejected
  • Docker scan scope: computes workflowDir relative to gitRoot and passes that as the scan target instead of always scanning .
  • Unit tests (runner_guard_test.go): covers JSON parsing, all severity→errorType mappings (critical/high/error→error, note/info→info, warning→warning), score/grade display, line-0 defaulting, multiple findings, empty/invalid JSON, and path sanitization
  • docker_images_test.go: added TestCheckAndPrepareDockerImages_RunnerGuardImageDownloading with useRunnerGuard=true

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 8, 2026

@copilot merge main, fix conflicts and recompile

Done in 7a02008. Resolved conflicts in docker_images_test.go (kept 4-arg CheckAndPrepareDockerImages + RunnerGuard test) and mcp_tools_readonly.go (kept args.RunnerGuard handling). Recompiled all 182 workflow lock files successfully.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw go-sdk/jsonrpc (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw BvL7sCC6_H4Vmy91-1 (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha successfully&#34; --local x_amd64/vet http.https://git/usr/bin/gh (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot remove this job and integrate runner guard with other security tools test

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 97f9a6e. Removed the separate runner_guard job and the artifact download step. Runner-guard now runs via --runner-guard in the existing compile step alongside zizmor, poutine, and actionlint, with findings in /tmp/gh-aw/compile-output.txt. Updated Phase 6 to reference that file instead of the removed artifact.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 8, 2026

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw XvBP7zTZlLMd (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw AQ9fVWd/inoXVaeP-C (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 8, 2026

@copilot validate docker image name

https://github.com/github/gh-aw/actions/runs/24136991460/job/70427760523#step:13:1

Fixed in 5d375e4. The CI was failing with Error response from daemon: manifest unknown because ghcr.io/vigilant-llc/runner-guard:v3.0.1 doesn't exist in the registry. The README shows the correct tag is latest, so updated RunnerGuardImage in docker_images.go, the comment in runner_guard.go, and both the pull and verify steps in static-analysis-report.md.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

Hey @pelikhan 👋 — great work on the runner-guard integration! Adding a fourth static analysis tool to the compile pipeline is exactly the kind of security hardening this project benefits from. The PR mirrors the existing patterns in poutine.go/poutine_test.go and zizmor.go/zizmor_test.go closely, which makes it easy to follow and review.

The contribution looks well-structured and ready for maintainer review. Here's a quick summary of what looks great:

  • Focused change — strictly scoped to runner-guard integration across the compile pipeline and the static-analysis-report workflow.
  • Tests includedrunner_guard_test.go (353 new lines) and updated docker_images_test.go cover the new code path.
  • Good bug fix included — the latent lockFilesForZizmor bug that caused --poutine/--runner-guard to silently skip when --zizmor wasn't set is a meaningful correctness fix.
  • No new Go dependencies — runner-guard runs as a Docker image (ghcr.io/vigilant-llc/runner-guard:v3.0.1), keeping the dependency footprint clean.
  • Clear description — the PR body comprehensively explains the CLI flags, compile pipeline wiring, workflow changes, and the latent bug fix.

This PR looks aligned with the project's contribution guidelines and quality standards. 🎉

Generated by Contribution Check · ● 2M ·

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 8, 2026

@copilot see #25316

Update static analysis agentic workflow to open an issue instead of discussion, close older issues.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 8, 2026

@copilot see #25316

Update static analysis agentic workflow to open an issue instead of discussion, close older issues.

Done in c9d2942. Changes in static-analysis-report.md:

  • Removed create-discussion from safe-outputs; replaced with a single create-issue config with close-older-issues: true, max: 4, title-prefix: "[static-analysis] ", expires: 7d
  • Phase 5 now creates an issue (titled [static-analysis] Report - DATE) instead of a discussion
  • Runner-guard finding issues updated to use the same [static-analysis] prefix
  • Output requirements and success criteria updated to reference issue instead of discussion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants