From c6c52013ecc629904537b7a41afc0764a116e5af Mon Sep 17 00:00:00 2001 From: Dotta Date: Thu, 27 Aug 2026 15:36:17 +0000 Subject: [PATCH] fix: hide harness issues from recent history Co-Authored-By: Paperclip --- server/src/__tests__/issue-user-recency.test.ts | 5 ++++- server/src/services/issue-user-recency.ts | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/server/src/__tests__/issue-user-recency.test.ts b/server/src/__tests__/issue-user-recency.test.ts index ca3ecc93a9f..d51b154a59b 100644 --- a/server/src/__tests__/issue-user-recency.test.ts +++ b/server/src/__tests__/issue-user-recency.test.ts @@ -160,6 +160,9 @@ describeEmbeddedPostgres("issue user recency persistence", () => { } const oldIssueId = await seedIssue(companyId, "Old", "RQB-28"); await recordIssueUserRecency(db, { companyId, userId, issueIds: [oldIssueId], kind: "commented", interactedAt: new Date("2026-07-01T00:00:00.000Z") }); + const harnessIssueId = await seedIssue(companyId, "Internal harness", "RQB-29"); + await db.update(issues).set({ harnessKind: "skill_test" }).where(eq(issues.id, harnessIssueId)); + await recordIssueUserRecency(db, { companyId, userId, issueIds: [harnessIssueId], kind: "edited", interactedAt: now }); const otherIssueId = await seedIssue(otherCompanyId, "Other company", "RQC-1"); await recordIssueUserRecency(db, { companyId: otherCompanyId, userId, issueIds: [otherIssueId], kind: "edited", interactedAt: now }); @@ -179,7 +182,7 @@ describeEmbeddedPostgres("issue user recency persistence", () => { const rows = await issueUserRecencyService(db).listRecentIssues(companyId, userId, 100, now); expect(rows).toHaveLength(25); expect(rows.map((row) => row.id)).toEqual(issueIds.slice(0, 25)); - expect(rows.some((row) => row.id === oldIssueId || row.id === otherIssueId)).toBe(false); + expect(rows.some((row) => [oldIssueId, harnessIssueId, otherIssueId].includes(row.id))).toBe(false); expect(rows[0]).toMatchObject({ hasActiveRun: true, needsAttention: true }); }); diff --git a/server/src/services/issue-user-recency.ts b/server/src/services/issue-user-recency.ts index fc451111f28..3308862941e 100644 --- a/server/src/services/issue-user-recency.ts +++ b/server/src/services/issue-user-recency.ts @@ -1,4 +1,4 @@ -import { and, desc, eq, gte, isNull, sql } from "drizzle-orm"; +import { and, desc, eq, gte, sql } from "drizzle-orm"; import { approvals, heartbeatRuns, @@ -10,6 +10,7 @@ import { } from "@paperclipai/db"; import type { IssueStatus, IssueUserRecencyKind, RecentIssue } from "@paperclipai/shared"; import type { LogActivityInput } from "./activity-log.js"; +import { visibleIssueCondition } from "./issue-visibility.js"; export const RECENT_ISSUES_MAX_LIMIT = 25; export const RECENT_ISSUES_WINDOW_DAYS = 30; @@ -151,7 +152,7 @@ export function issueUserRecencyService(db: Db) { eq(issueUserRecency.companyId, companyId), eq(issueUserRecency.userId, userId), gte(issueUserRecency.lastInteractedAt, cutoff), - isNull(issues.hiddenAt), + visibleIssueCondition(), )) .orderBy(desc(issueUserRecency.lastInteractedAt), desc(issueUserRecency.issueId)) .limit(limit);