Skip to content

fix: reduce Super Linter fixture noise and preserve failure diagnostics - #68733

Merged
pelikhan merged 1 commit into
mainfrom
pelikhan-super-linter-signal-quality
Oct 14, 2026
Merged

pelikhan merged 1 commit into
mainfrom
pelikhan-super-linter-signal-quality

Conversation

@pelikhan

Copy link
Copy Markdown
Collaborator

Summary

  • Exclude intentional pkg/linters/*/testdata/ inputs and the dependency-only .github/workflows/go.mod before Super Linter queues GO_MODULES package directories. Keep analyzer implementations, normal tests, root module, real source, and the existing production linter checks enabled.
  • Let expected linter findings reach the reporting agent, recording the actual failed/successful step outcome. A missing log remains an explicit error.
  • Report bounded, deduplicated groups for tool/configuration errors, fixture noise, and real source findings rather than reproducing the full log in an issue.
  • Add scope and generated-lock regression tests, registered in make test-scripts.

Evidence

Scheduled run 38576278267 had 2,405 diagnostic-shaped lines, including 1,016 intentional fixture lines. Exact-line deduplication leaves 1,041 nonfixture diagnostics, including four production gosec G115 conversions. These are old-run observations, not claims of exploitable vulnerabilities or results of a rerun. No production source findings were mass-fixed or suppressed; unknown custom nolint warnings remain explicitly reportable.

The pinned Super Linter implementation queues each selected Go file's containing directory, so filtering only module manifests or relying on Go's usual recursive testdata exclusion is insufficient. The new filter operates before directory queueing.

Validation

  • python3 scripts/test_super_linter_scope.py: three tests pass, including all existing analyzer fixture trees and negative boundary cases.
  • make recompile: 344/344 workflows compile; only the affected generated lock is changed.
  • Current ./gh-aw compile super-linter --validate --shellcheck --actionlint: passes with zero warnings and clean actionlint.
  • make agent-report-progress: passes schema/source-lock freshness and full workflow drift. Impacted Go tests are skipped because no Go sources changed.
  • Same-reviewer final source/normal-lock safety review: PASS for local patch publication; no confirmed new vulnerabilities.

Remaining limitations

The scanner-enabled compile-only dry-run emitted a private diagnostic lock but failed on unrelated diagnostic compiler output: an empty top-level env and five dangling daily-credit activation outputs; zizmor also flags existing framework secrets outside dedicated environments. Shellcheck and poutine passed. The diagnostic lock is not published and that failed gate is not claimed passed. The normal generated lock passes actionlint.

No workflow dispatch or rerun was attempted. Raw logs are not committed.

Exclude intentional analyzer fixtures and the dependency-only workflow manifest without changing production linter checks. Preserve failed linter outcomes for bounded grouped analysis and add scope regressions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@pelikhan
pelikhan marked this pull request as ready for review October 14, 2026 15:31
Copilot AI balanced review requested due to automatic review settings October 14, 2026 15:31
@pelikhan
pelikhan merged commit a5c80a9 into main Oct 14, 2026
52 checks passed
@pelikhan
pelikhan deleted the pelikhan-super-linter-signal-quality branch October 14, 2026 15:32
@github-actions

github-actions Bot commented Oct 14, 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 commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

✅ Ponytail Reviewer completed successfully!

Generated by Ponytail Reviewer for #68733

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

✅ Design Decision Gate 🏗️ completed the design decision gate check. See the comment below for the result and any generated ADR draft.

Design Decision Gate 🏗️

Outcome: reported_no_action

The agent completed and reported no action. A no-op output alone does not verify that all required work was completed or that publication was possible.

Agent messages are omitted from this comment. The category uses structured run status, not interpretation of agent prose.

Generated from Design Decision Gate 🏗️ · opus50 · 13.6 AIC · ⌖ 40.2 AIC · ◇ 49.2 AIC · ⊞ 1.8K · ◷

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

✅ Test Quality Sentinel completed test quality analysis.

Test Quality Sentinel

Outcome: reported_no_action

The agent completed and reported no action. A no-op output alone does not verify that all required work was completed or that publication was possible.

Agent messages are omitted from this comment. The category uses structured run status, not interpretation of agent prose.

Generated from Test Quality Sentinel · haiku45 · 5.84 AIC · ⌖ 9.11 AIC · ◇ 1.62 AIC · ⊞ 8.8K · ◷

🧪 Test quality analysis by Test Quality Sentinel

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

✅ PR Code Quality Reviewer completed the code quality review.

🔎 Code quality review by PR Code Quality 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.

L60-74: delete: brittle source/lock text-presence mirror for unrelated reporting behavior. Keep the path-matching checks above; workflow compilation and drift checks cover generated lock consistency.

net: -15 lines possible.

Generated by ✂️ Ponytail Reviewer for #68733 · codex · gpt56 · 8.67 AIC · ⌖ 5.3 AIC · ⊞ 14.2K
Comment /ponytail to run again

with self.subTest(path=prefix + path):
self.assertFalse(self.excluded(prefix + path))

def test_generated_lock_preserves_scope_and_reports_failures(self):

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.

L60-74: delete: brittle source/lock text-presence mirror for unrelated reporting behavior. Keep the path-matching checks above; workflow compilation and drift checks cover generated lock consistency.

@github-actions

Copy link
Copy Markdown
Contributor

Comment Memory

Peek at saved memory (pr-code-quality-reviewer)
reviewed_at: 2026-10-14T15:35:22Z
review_event: COMMENT
top_themes:
  - regression-test brittleness
  - super-linter diagnostics preservation
files_reviewed:
  - .github/workflows/super-linter.md
  - .github/workflows/super-linter.lock.yml
  - scripts/test_super_linter_scope.py
  - Makefile
comment_count: 1

Note

This comment is managed by comment memory.

Expand the saved memory block to view or edit the persistent context for this thread.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

🔎 Code quality review by PR Code Quality Reviewer · copilot · gpt54 · 34.6 AIC · ⌖ 5.82 AIC · ⊞ 21.3K · ◷
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

I did not find a changed-line bug here that clearly warrants blocking the PR, but I left one maintainability comment on the new regression test.

The main risk area I saw

The workflow changes themselves look directionally sound: they preserve the failing super-linter outcome for later analysis, keep artifact retention for diagnostics, and add regression coverage around the new exclusion scope. The only issue I found worth surfacing is that part of the Python regression test now locks the workflow prompt to exact prose, which will create avoidable test churn on harmless copy edits.

🔎 Code quality review by PR Code Quality Reviewer · copilot · gpt54 · 34.6 AIC · ⌖ 5.82 AIC · ⊞ 21.3K
Comment /review to run again

self.assertIn("if-no-files-found: error", text)
self.assertNotIn("GO_CONFIG_FILE:", self.source)
self.assertNotIn("LINTER_RULES_PATH:", self.source)
self.assertIn("twenty examples total", self.source)

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.

This regression test is overfitted to prompt prose, so a harmless wording cleanup will start failing make test-scripts and block unrelated workflow changes.

💡 Why this is risky and how to tighten it

Right now the assertions on "twenty examples total" and "does not establish an exploitable vulnerability" are checking editorial phrasing rather than the scope/reporting behavior this test is supposed to protect. That makes the test noisy to maintain and encourages cargo-cult prompt wording instead of letting us revise instructions safely.

A safer pattern is to keep the structural checks here (FILTER_REGEX_EXCLUDE, continue-on-error, result artifact path, missing-log failure) and drop the exact English sentence matches, or replace them with a smaller semantic anchor that is unlikely to change during prompt edits.

self.assertNotIn("[Include the full linter output here]", self.source)
# Keep behavior-focused assertions only; avoid exact prompt prose checks.

That still guards the workflow contract without turning copy edits into failing tests.

@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 /diagnosing-bugs (per pr-triage) — this is a focused, well-tested bug fix with a clear regression test. Approving.

📋 Verification performed
  • Ran python3 scripts/test_super_linter_scope.py against the PR commit in a clean checkout: all 3 tests pass.
  • Ran ./gh-aw compile .github/workflows/super-linter.md and confirmed zero drift in super-linter.lock.yml — the lock faithfully reflects the new FILTER_REGEX_EXCLUDE, continue-on-error: true, LINTER_OUTCOME env, and artifact path changes.
  • Confirmed continue-on-error: true on an external action step is an established pattern elsewhere in the codebase (checkout_step_generator.go, cache_memory.go), so this isn't a novel risk.
  • Confirmed the downstream agent job still correctly depends on needs: [activation, super_linter], so continue-on-error only prevents the job from short-circuiting, not from gating the agent step — findings will reach the reporting agent as intended.
  • Confirmed the root-cause diagnosis in the PR description (pinned Super Linter queues each Go file's containing directory for GO_MODULES, so testdata fixtures get swept in) is correctly addressed at the regex-exclusion layer, not just patched around symptoms.
  • scripts/test_super_linter_scope.py has solid coverage: positive/negative boundary cases for testdata exclusion, real source inclusion (including _test.go files and files merely named testdata_helpers.go), and a generated-lock assertion that catches drift between the .md source and .lock.yml.

Positive Highlights

  • ✅ Root cause addressed at the source (file-path filtering before directory queueing), not a special-case/workaround.
  • ✅ New regression test is registered in make test-scripts, so it runs in CI rather than being a one-off manual check.
  • ✅ check-results step now distinguishes "no log produced" (hard error) from "linter step failed but log exists" (warning + continued analysis) — this is a meaningful improvement to failure-mode clarity.

No actionable issues found in the changed lines.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · copilot · sonnet50 · 109.7 AIC · ⌖ 14.4 AIC · ⊞ 10.3K
Comment /matt to run again

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.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Copilot review overview

3 open findings
What changed in this PR

Reduces Super Linter noise by excluding intentional fixture inputs and preserving clearer failure diagnostics, while adding regression tests to prevent future scope drift.

Changes:

  • Excludes pkg/linters/*/testdata/ and .github/workflows/go.mod from GO_MODULES directory queueing via FILTER_REGEX_EXCLUDE.
  • Preserves Super Linter step outcome for downstream reporting by continuing on error and emitting a result file alongside the log artifact.
  • Adds Python regression tests for scope + generated lock expectations and wires them into make test-scripts.
File Description
scripts/​test_super_linter_scope.py Adds regression tests for exclusion scope and for generated lock invariants (outcome/result file, bounded reporting instructions).
Makefile Registers the new Python test under test-scripts.
.github/​workflows/​super-linter.md Updates Super Linter config to reduce fixture noise, preserve failure diagnostics, and bound reporting output.
.github/​workflows/​super-linter.lock.yml Regenerates the pinned/compiled workflow lock to reflect the updated workflow behavior.

🧠 Review effort: Lite


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

Comment on lines +72 to +76
printf 'super-linter outcome: %s\n' "$LINTER_OUTCOME" > /tmp/super-linter-result.txt
if [ ! -s "super-linter.log" ]; then
echo "::error::Super-linter did not produce a nonempty log; analysis is unavailable."
exit 1
fi
Comment on lines +99 to +102
path: |
/tmp/super-linter.log
/tmp/super-linter-result.txt
if-no-files-found: error
self.assertGreater(len(fixtures), 0)
for fixture in fixtures:
self.assertTrue(self.excluded(str(fixture.relative_to(ROOT))), fixture)
self.assertEqual(list((ROOT / ".github/workflows").rglob("*.go")), [])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants