From 7c23e2208274ffb31ed4b875e496f1cc060a0b25 Mon Sep 17 00:00:00 2001 From: joaovictor91123 Date: Thu, 2 Jul 2026 10:20:14 +0400 Subject: [PATCH] fix(signals): delegate engine test-path checks to isTestPath --- src/signals/engine.ts | 22 ++++++---------------- test/unit/signals.test.ts | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/signals/engine.ts b/src/signals/engine.ts index 734b0d228b..53b860e12f 100644 --- a/src/signals/engine.ts +++ b/src/signals/engine.ts @@ -26,7 +26,7 @@ import type { GittensorContributorSnapshot } from "../gittensor/api"; import { nowIso } from "../utils/json"; import { sanitizePublicComment } from "../queue-intelligence"; import { labelMatchesPattern, projectLinkedIssueMultiplierForPlannedSolve, type LinkedIssueMultiplierStatus } from "../scoring/preview"; -import { hasLocalTestEvidence } from "./test-evidence"; +import { hasLocalTestEvidence, isTestPath } from "./test-evidence"; import { isFailingCheckSummary } from "./local-branch"; import { isDuplicateClusterWinnerByClaim } from "./duplicate-winner"; import { PREFLIGHT_LIMITS } from "./preflight-limits"; @@ -2138,7 +2138,7 @@ export function buildRepoOutcomePatterns(args: { }; for (const pr of outsideDecided) { for (const bucket of new Set(pr.filePaths.map(pathBucket))) addToGroup("path", bucket, pr); - if (pr.filePaths.length > 0) addToGroup("test_evidence", pr.filePaths.some(isTestFile) ? "with_tests" : "without_tests", pr); + if (pr.filePaths.length > 0) addToGroup("test_evidence", pr.filePaths.some(isTestPath) ? "with_tests" : "without_tests", pr); for (const label of pr.labels) addToGroup("label", label, pr); const size = sizeBucket(pr); if (size) addToGroup("size", size, pr); @@ -2571,7 +2571,7 @@ export function buildPreflightResult( findings.push(...issueQualityFindings(linkedIssues, issueQuality)); const changedFiles = input.changedFiles ?? []; const tests = input.tests ?? []; - if (changedFiles.some((file) => isCodeFile(file)) && tests.length === 0 && !changedFiles.some((file) => isTestFile(file))) { + if (changedFiles.some((file) => isCodeFile(file)) && tests.length === 0 && !changedFiles.some((file) => isTestPath(file))) { findings.push({ code: "missing_test_evidence", severity: "warning", @@ -2619,7 +2619,7 @@ export function buildLocalDiffPreflightResult( issueQuality, ); const codeFileCount = changedFiles.filter(isCodeFile).length; - const testFileCount = changedFiles.filter(isTestFile).length; + const testFileCount = changedFiles.filter(isTestPath).length; /* v8 ignore next -- Sparse local-git adapters omit changed-line totals; aggregate local diff behavior covers the zero fallback. */ const changedLineCount = input.changedLineCount ?? 0; const findings = [...base.findings]; @@ -2721,7 +2721,7 @@ export function buildPullRequestMaintainerPacket(args: { ? collisions.clusters.filter((cluster) => cluster.items.some((item) => item.type === "pull_request" && item.number === pr.number)).length : 0; const codeFiles = args.files.filter((file) => isCodeFile(file.path)); - const testFiles = args.files.filter((file) => isTestFile(file.path)); + const testFiles = args.files.filter((file) => isTestPath(file.path)); const additions = args.files.reduce((sum, file) => sum + file.additions, 0); const deletions = args.files.reduce((sum, file) => sum + file.deletions, 0); const approvalCount = args.reviews.filter((review) => review.state.toUpperCase() === "APPROVED").length; @@ -5484,17 +5484,7 @@ function sanitizeOutcomeDimensionKey(key: string): string { } function isCodeFile(file: string): boolean { - return /\.(ts|tsx|js|jsx|py|rb|rs|kt|scala|java|go|sql)$/i.test(file) && !isTestFile(file); -} - -function isTestFile(file: string): boolean { - return ( - /(^|\/)(test|tests|spec|__tests__)\//i.test(file) || - /(^|\/)src\/test\//i.test(file) || - /(^|\/)[^/]+_test\.(go|py|rb)$/i.test(file) || - /(^|\/)[^/]+_spec\.rb$/i.test(file) || - /\.(test|spec)\.(ts|tsx|js|jsx|py|rb|rs)$/i.test(file) - ); + return /\.(ts|tsx|js|jsx|py|rb|rs|kt|scala|java|go|sql)$/i.test(file) && !isTestPath(file); } function riskRank(risk: CollisionCluster["risk"]): number { diff --git a/test/unit/signals.test.ts b/test/unit/signals.test.ts index 2480e2fb74..915e30af05 100644 --- a/test/unit/signals.test.ts +++ b/test/unit/signals.test.ts @@ -423,6 +423,21 @@ describe("world-class backend signals", () => { expect(result.findings.map((finding) => finding.code)).toContain("missing_test_evidence"); }); + it("preflight treats Cypress and snapshot paths as test evidence", () => { + const result = buildPreflightResult( + { + repoFullName: repo.fullName, + title: "Add Cypress login coverage", + body: "Fixes #7", + changedFiles: ["cypress/e2e/login.cy.ts", "src/auth.ts"], + }, + repo, + issues, + pullRequests, + ); + expect(result.findings.map((finding) => finding.code)).not.toContain("missing_test_evidence"); + }); + it("gates public comments to detected contributors and sanitizes comment text", () => { const currentPr = pullRequests[0]!; const priorPr: PullRequestRecord = {