Skip to content

Introduce a shared Finding/SeverityLevel type across scanner integrations - #54690

Open
pelikhan with Copilot wants to merge 9 commits into
mainfrom
copilot/deep-report-introduce-shared-finding-type
Open

Introduce a shared Finding/SeverityLevel type across scanner integrations#54690
pelikhan with Copilot wants to merge 9 commits into
mainfrom
copilot/deep-report-introduce-shared-finding-type

Conversation

Copilot AI commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Nine scanner/finding integrations each declared their own finding struct with a different severity vocabulary (High, error, Negligible, note, …) and its own location shape, so severity classification, message building and rendering were reimplemented per tool.

Changes

  • New pkg/scanfindings
    • SeverityLevel enum (unknown < info < low < medium < high < critical) with ParseSeverity normalization, Rank, AtLeast, and ErrorType (console error/warning/info mapping).
    • Finding{RuleID, Severity, Message, File, Line, Column, Context} plus CompilerError, FormatMessage, Render, Sort, CountAtLeast, and ContextLines (the ±2 source-line window each tool used to duplicate).
  • Tool integrations (zizmor, poutine, grype, grant, runner-guard): native structs are still used for JSON decoding, then mapped onto the shared type by a small …FindingsToShared adapter and rendered once via scanfindings.Render. Poutine's two duplicated rendering loops collapse into a single adapter; zizmor's high-severity counting becomes AtLeast(SeverityHigh).
  • yamllint: yamllintIssue removed — parseYamllintLine returns a scanfindings.Finding directly.
  • Non-tool finding types: audit Finding.Severity is now SeverityLevel (JSON representation unchanged); ValidationIssue gains Severity()/ToFinding(); workflow.SecurityFinding gains ToFinding() and FormatSecurityFindings renders through it.

Adding a scanner is now mostly field mapping:

func runnerGuardFindingsToShared(findings []runnerGuardFinding, fileLines []string) []scanfindings.Finding {
	shared := make([]scanfindings.Finding, 0, len(findings))
	for _, f := range findings {
		lineNum := max(f.Line, 1)
		shared = append(shared, scanfindings.Finding{
			RuleID:   f.RuleID,
			Severity: scanfindings.ParseSeverity(f.Severity),
			Message:  scanfindings.FormatMessage(f.Severity, f.RuleID, f.Name),
			File:     f.File,
			Line:     lineNum,
			Column:   1,
			Context:  scanfindings.ContextLines(fileLines, lineNum),
		})
	}
	return shared
}

Behavior

Severity → console error type is now defined once: critical/high → error, medium/unknown → warning, low/info → info. This matches the previous per-tool mapping for every severity exercised by existing tests; the only divergence is that low-severity zizmor and runner-guard findings now render as info instead of warning, aligning them with grype.


Run: https://github.com/github/gh-aw/actions/runs/32552086004> Generated by 👨‍🍳 PR Sous Chef · gpt54 · 28.1 AIC · ⌖ 8.19 AIC · ⊞ 9.5K ·

Comment /souschef to run again


pr-sous-chef run: https://github.com/github/gh-aw/actions/runs/32552825826> Generated by 👨‍🍳 PR Sous Chef · gpt54 · 24.2 AIC · ⌖ 8.28 AIC · ⊞ 9.5K ·

Comment /souschef to run again

Copilot AI and others added 3 commits August 22, 2026 02:41
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Introduce shared Finding and SeverityLevel type across security scanners Introduce a shared Finding/SeverityLevel type across scanner integrations Aug 22, 2026
Copilot AI requested a review from pelikhan August 22, 2026 03:01
@pelikhan
pelikhan marked this pull request as ready for review August 22, 2026 03:08
Copilot AI balanced review requested due to automatic review settings August 22, 2026 03:08
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

Test Quality Sentinel skipped because pre-fetch PR data was unavailable: unable to fetch test file diff

🧪 Test quality analysis by Test Quality Sentinel

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check.

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Ponytail Reviewer completed successfully!

Generated by Ponytail Reviewer for #54690

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • registry.npmjs.org

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "registry.npmjs.org"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ponytail review: mostly a clean consolidation, one unused-API finding.

net: -30 lines possible.

Generated by ✂️ Ponytail Reviewer for #54690 · auto · 25.8 AIC · ⌖ 3.46 AIC · ⊞ 7.3K
Comment /ponytail to run again

Comment on lines +172 to +191
// Sort orders findings by file, then line, then column, then by decreasing
// severity, then by rule identifier. The ordering is stable and deterministic so
// that scanner output can be compared across runs.
func Sort(findings []Finding) {
slices.SortStableFunc(findings, func(a, b Finding) int {
if c := strings.Compare(a.File, b.File); c != 0 {
return c
}
if c := cmp.Compare(a.Line, b.Line); c != 0 {
return c
}
if c := cmp.Compare(a.Column, b.Column); c != 0 {
return c
}
if c := cmp.Compare(b.Severity.Rank(), a.Severity.Rank()); c != 0 {
return c
}
return strings.Compare(a.RuleID, b.RuleID)
})
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

L172-191: delete: Sort exported but never called outside its own test. Nothing replaces it — drop until a caller needs it.
L194-202: delete: CountAtLeast has the same fate, unused outside tests.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Introduces a shared scanner finding model to centralize severity normalization, rendering, sorting, and source context handling.

Changes:

  • Adds scanfindings.Finding and SeverityLevel.
  • Migrates scanner output through shared adapters.
  • Integrates audit, validation, and Markdown security findings.
Show a summary per file
File Description
pkg/scanfindings/scanfindings.go Adds shared finding APIs.
pkg/scanfindings/scanfindings_test.go Tests shared behavior.
pkg/scanfindings/README.md Documents the package.
pkg/cli/zizmor.go Adapts zizmor findings.
pkg/cli/poutine.go Consolidates poutine rendering.
pkg/cli/grype.go Adapts vulnerability findings.
pkg/cli/grant.go Adapts license findings.
pkg/cli/runner_guard.go Adapts runner-guard findings.
pkg/cli/yamllint.go Parses directly into shared findings.
pkg/cli/yamllint_test.go Updates parser expectations.
pkg/cli/validation_issue.go Adds finding conversion.
pkg/cli/audit_report.go Uses shared severity values.
pkg/cli/audit_report_test.go Updates severity assertions.
pkg/cli/audit_report_render.go Uses shared severity operations.
pkg/cli/audit_agentic_analysis.go Normalizes assessment severity.
pkg/cli/audit_agent_output_test.go Updates severity assertions.
pkg/workflow/markdown_security_scanner.go Converts security findings for rendering.

Review details

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

  • Files reviewed: 17/17 changed files
  • Comments generated: 2
  • Review effort level: Balanced

Comment thread pkg/scanfindings/scanfindings.go Outdated
Comment on lines +212 to +217
start := max(1, line-2)
end := min(len(fileLines), line+2)

context := make([]string, 0, end-start+1)
for i := start; i <= end; i++ {
context = append(context, fileLines[i-1])
Comment thread pkg/cli/validation_issue.go Outdated
Comment on lines +13 to +27
// Severity maps the issue type ("error", "warning", ...) onto the shared
// severity vocabulary used by the scanner integrations.
func (v ValidationIssue) Severity() scanfindings.SeverityLevel {
return scanfindings.ParseSeverity(v.Type)
}

// ToFinding converts the validation issue to the shared finding representation.
func (v ValidationIssue) ToFinding() scanfindings.Finding {
return scanfindings.Finding{
Severity: v.Severity(),
Message: v.Message,
File: v.File,
Line: v.Line,
}
}

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review: Shared scanfindings Package

This is a clean, well-motivated refactoring. The new pkg/scanfindings package successfully eliminates the per-tool severity string scattered across grype.go, zizmor.go, poutine.go, and grant.go, and replaces it with a single typed vocabulary.

Strengths:

  • SeverityLevel as a string type preserves JSON marshalling compatibility and keeps the zero value ("") distinct from the mapped values.
  • ParseSeverity covers all known scanner dialects with a thorough test table.
  • Sort, CountAtLeast, and ContextLines are useful shared utilities that would otherwise be duplicated.
  • The Render helper centralises the console.FormatError loop.

One non-blocking note (inline): SecurityFinding.ToFinding hardcodes SeverityHigh for all markdown security findings. Whether this is intentional or an oversight is unclear without a comment — worth clarifying.

Overall the change is correct and improves maintainability.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 40.1 AIC · ⌖ 9.1 AIC · ⊞ 6.2K

// used by the scanner integrations. Markdown security findings are hard
// rejections, so they are always reported at high severity.
func (f SecurityFinding) ToFinding(filePath string) scanfindings.Finding {
return scanfindings.Finding{

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hardcoded SeverityHigh may underclassify critical findings

ToFinding always emits SeverityHigh regardless of the SecurityFindingCategory. Categories like CategoryTemplateInjection or CategorySecretExposure are arguably critical-severity violations — a consumer applying CountAtLeast(findings, SeverityCritical) would silently miss them.

Consider either:

  • Using SeverityCritical for the highest-risk categories, or
  • Adding a comment explicitly documenting that ToFinding is intentionally capped at SeverityHigh and why — otherwise it looks like an oversight rather than a deliberate design choice.

@copilot please address this.

@github-actions

Copy link
Copy Markdown
Contributor

Comment Memory

reviewed_at: 2026-08-22T00:00:00Z
review_event: COMMENT
top_themes:
  - no actionable findings in changed lines
files_reviewed:
  - pkg/cli/audit_agent_output_test.go
  - pkg/cli/audit_agentic_analysis.go
  - pkg/cli/audit_report.go
  - pkg/cli/audit_report_render.go
  - pkg/cli/audit_report_test.go
  - pkg/cli/grant.go
  - pkg/cli/grype.go
  - pkg/cli/poutine.go
  - pkg/cli/runner_guard.go
  - pkg/cli/validation_issue.go
  - pkg/cli/yamllint.go
  - pkg/cli/yamllint_test.go
  - pkg/cli/zizmor.go
  - pkg/scanfindings/README.md
  - pkg/scanfindings/scanfindings.go
  - pkg/scanfindings/scanfindings_test.go
  - pkg/workflow/markdown_security_scanner.go
comment_count: 0

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • registry.npmjs.org

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "registry.npmjs.org"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer · gpt54 · 9.61 AIC · ⌖ 6.85 AIC · ⊞ 7K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Verdict

No blocking issues jumped out in the changed lines.

The refactor centralizes scanner finding rendering and severity normalization, and the changed paths are covered by targeted tests. I did not find a correctness or regression risk in the diff that is specific enough to justify a review comment.

I spot-checked the shared severity mapping, per-tool adapters, and the audit/report call sites. The remaining red test output from go test ./pkg/cli/... ./pkg/workflow/... is in an unrelated interactive test (TestConfirmRunAddedWorkflow_ContextCancelled), not in the touched code.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • registry.npmjs.org

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "registry.npmjs.org"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer · gpt54 · 9.61 AIC · ⌖ 6.85 AIC · ⊞ 7K
Comment /review to run again

Add draft Architecture Decision Record for the introduction of the
shared Finding/SeverityLevel type across scanner integrations (PR #54690).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (765 new lines across pkg/scanfindings, pkg/cli, and pkg/workflow) but did not have a linked Architecture Decision Record (ADR).

📄 Draft ADR committed: docs/adr/54690-shared-scanfindings-type-for-scanner-integrations.md — review and complete it before merging.

🔒 This PR cannot merge until an ADR is linked in the PR body.

📋 What to do next
  1. Review the draft ADR committed to your branch — it was generated from the PR diff
  2. Complete the missing sections — add context the AI couldn't infer, refine the decision rationale, and list real alternatives you considered
  3. Commit the finalized ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-54690: Shared Finding/SeverityLevel Type Across Scanner Integrations

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

❓ Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.

📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 0042-use-postgresql.md for PR #42).

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · sonnet46 · 102.6 AIC · ⌖ 21.5 AIC · ⊞ 9.5K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Skills-Based Review 🧠

Applied /codebase-design, /tdd, and /diagnosing-bugs — requesting changes on a path regression, a silent severity downgrade, and missing adapter tests.

📋 Key Themes & Highlights

Key Themes

  • Path regression in poutine: poutineFindingsToShared uses caller-supplied filePath unconditionally instead of finding.Meta.Path, which was used in the old code. Directory-scan findings for nested files will show the wrong path.
  • Silent severity downgrade: ParseSeverity(assessment.Severity) in audit_agentic_analysis.go returns SeverityUnknown for unrecognised values with no log — previously the raw string was preserved.
  • Missing adapter unit tests: none of the five ...FindingsToShared functions are directly tested; field-mapping bugs (wrong severity, swapped file/line) are invisible to the test suite.
  • ValidationIssue.ToFinding() leaves RuleID empty: inconsistent with every other adapter.
  • SeverityLevel is an unguarded string alias: callers can pass bare literals without compile-time errors.

Positive Highlights

  • ✅ Clean, deep module design: one Finding type, one Render, one severity table — exactly the right level of abstraction.
  • ✅ Thorough scanfindings package tests covering ParseSeverity, Sort, AtLeast, ContextLines, Render, and CompilerError.
  • ✅ Poutine's duplicate rendering loops correctly collapsed into a single shared adapter.
  • filterActionableFindings replaced with the idiomatic AtLeast(SeverityLow) — much cleaner.
  • ✅ README documents the public API clearly.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 80 AIC · ⌖ 11.6 AIC · ⊞ 7.6K
Comment /matt to run again

Comment thread pkg/cli/poutine.go

fmt.Fprint(os.Stderr, console.FormatError(compilerErr))
message := scanfindings.FormatMessage(severityLabel, finding.RuleID, title)
if finding.Meta.Details != "" {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/codebase-design] filePath replaces finding.Meta.Path — if poutine reports a finding under a path that differs from the caller-supplied filePath (e.g. a nested file in a directory scan), the displayed location will be wrong.

💡 Suggestion

Prefer the path embedded in the finding and fall back to filePath only when empty:

file := finding.Meta.Path
if file == "" {
    file = filePath
}

The same applies in parseAndDisplayPoutineOutput, which also passes targetFile as the blanket filePath.

@copilot please address this.

findings = append(findings, Finding{
Category: category,
Severity: assessment.Severity,
Severity: scanfindings.ParseSeverity(assessment.Severity),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/diagnosing-bugs] ParseSeverity(assessment.Severity) silently returns SeverityUnknown for any value not in the lookup table. If the upstream AI emits e.g. "MEDIUM" (upper-case), the severity disappears without a trace — the finding still surfaces but reads as "unknown".

💡 Suggestion

Log unrecognised values so they don't silently degrade:

sev := scanfindings.ParseSeverity(assessment.Severity)
if sev == scanfindings.SeverityUnknown && assessment.Severity != "" {
    log.Debug("unrecognised assessment severity", "raw", assessment.Severity)
}

A test covering the full range of AI-emitted severity strings would also guard against future changes.

@copilot please address this.

Comment thread pkg/cli/validation_issue.go Outdated
func (v ValidationIssue) Severity() scanfindings.SeverityLevel {
return scanfindings.ParseSeverity(v.Type)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/codebase-design] ToFinding() leaves RuleID empty. Every other adapter populates RuleID, which enables deduplication, filtering, and future cross-run correlation.

💡 Suggestion

Use the issue type as a fallback rule-id proxy:

func (v ValidationIssue) ToFinding() scanfindings.Finding {
    return scanfindings.Finding{
        RuleID:   v.Type, // type used as rule-id proxy until a proper rule field is added
        Severity: v.Severity(),
        Message:  v.Message,
        File:     v.File,
        Line:     v.Line,
    }
}

@copilot please address this.

Comment thread pkg/cli/grant.go
findings = append(findings, scanfindings.Finding{
RuleID: "license-policy",
Severity: scanfindings.SeverityHigh,
Message: fmt.Sprintf("license policy violation: %s (%s)", grantPackageRef(pkg), licenses),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/codebase-design] SeverityHigh is hardcoded for all license violations. This matches the old "error" type, so there's no regression, but the intent isn't visible to future contributors.

💡 Suggestion

Add a brief comment explaining the deliberate choice:

// All denied licenses are treated as high-severity policy violations.
// Grant doesn't provide per-package severity, so a fixed level is used here.
Severity: scanfindings.SeverityHigh,

@copilot please address this.


// SeverityLevel is the shared severity vocabulary used by every scanner
// integration. Native severity labels are normalized with ParseSeverity.
type SeverityLevel string

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/codebase-design] SeverityLevel is a plain string alias. Callers can pass bare string literals ("high", "High") where a SeverityLevel is expected without a compile-time error — the very fragmentation this package was introduced to eliminate.

💡 Suggestion

A godoc warning makes the risk explicit at the definition site:

// SeverityLevel is the canonical severity type. Always construct values
// via the declared constants or ParseSeverity — do NOT pass untyped string
// literals; they are not validated at compile time.
type SeverityLevel string

If compile-time safety matters, a struct wrapper (type SeverityLevel struct{ v string }) prevents unguarded literals entirely — though that's a more invasive change.

@copilot please address this.

Comment thread pkg/cli/poutine.go
@@ -515,69 +462,51 @@ func parseAndDisplayPoutineOutputForDirectory(stdout string, verbose bool, gitRo
fileLines = strings.Split(string(fileContent), "\n")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/tdd] None of the five ...FindingsToShared adapters (poutine, grype, zizmor, runner_guard, grant) have direct unit tests. These functions are the integration seam between each tool's native output and the shared type — a silent field-mapping error (wrong severity, swapped file/line) won't be caught by existing tests.

💡 Suggestion

Add a small table-driven test per adapter in each tool's _test.go. Example for grypeFindingsToShared:

func TestGrypeFindingsToShared(t *testing.T) {
    matches := []grypeFinding{{
        Vulnerability: grypeVulnerability{ID: "CVE-2024-1234", Severity: "High"},
        Artifact:      grypeArtifact{Name: "foo", Version: "1.0"},
    }}
    got := grypeFindingsToShared("myimage:latest", matches)
    require.Len(t, got, 1)
    assert.Equal(t, scanfindings.SeverityHigh, got[0].Severity)
    assert.Equal(t, "CVE-2024-1234", got[0].RuleID)
    assert.Equal(t, "myimage:latest", got[0].File)
}

Covering at least severity mapping and RuleID/File population would give immediate regression safety.

@copilot please address this.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot this PR still needs forward progress before maintainer review.

  • The ADR gate still requires the drafted ADR to be completed and linked in the PR body.
  • Please review the current branch for any remaining adapter/path regressions raised in prior reviews, push follow-up fixes if needed, and leave a concise maintainer handoff.
  • Refresh the branch if possible and run the pr-finisher skill before handing back.

Run: https://github.com/github/gh-aw/actions/runs/32552825826

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 24.2 AIC · ⌖ 8.28 AIC · ⊞ 9.5K ·
Comment /souschef to run again

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

@copilot this PR still needs forward progress before maintainer review.

  • The ADR gate still requires the drafted ADR to be completed and linked in the PR body....

Follow-up pushed in 286aab4: ADR-54690 is accepted, context boundaries stay renderer-aligned, validation severity is explicit, and poutine preserves reported paths. Focused tests, build, lint, full tests, and recompile pass. The remaining CI failures are baseline (largefunc) and cached-checkout merge-base resolution; re-trigger CI on the new head for maintainer review.

@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

  • Category: feature
  • Risk: high
  • Priority score: 58/100 (impact 30, urgency 20, quality 8)
  • Recommended action: fast_track
  • CI status: failing

Generated by 🔧 PR Triage Agent · auto · 82.9 AIC · ⌖ 6.65 AIC · ⊞ 8.3K ·

@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

Category: feature | Risk: high | Priority: high | Score: 72/100
Recommended action: fast_track

Unifies Finding/SeverityLevel across 9 scanner integrations, 852/344 across 20 files. CI 2 failures need resolution first.

Automated triage — run 32572524009

Generated by 🔧 PR Triage Agent · auto · 65.4 AIC · ⌖ 6.04 AIC · ⊞ 8.3K ·

@github-actions

Copy link
Copy Markdown
Contributor

🛠️ Agentic Maintenance updated this pull request branch.

View workflow run

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[deep-report] Introduce a shared Finding/SeverityLevel type across 9 security-scanner integrations

4 participants