From a68f707f0bd68e9623e40e1dc8a7dc7e310c91ac Mon Sep 17 00:00:00 2001 From: Jesse Merhi <79823012+jesse-merhi@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:23:56 +1000 Subject: [PATCH] fix(moderation): cap signal scan retries (#3197) * fix(moderation): replace stale signal scans * fix(moderation): bound stale scan recovery * fix(moderation): cap signal scan retries * fix(management): show terminal signal scan failures * docs: add signal failure UI proof * fix(moderation): preserve signal retry status --- convex/publisherAbuse.test.ts | 100 ++++++- convex/publisherAbuse.ts | 70 +++-- convex/publisherAbuseTemporalScan.test.ts | 150 +++++++++- convex/publisherAbuseTemporalScan.ts | 276 +++++++++++++++++- convex/schema.ts | 7 + .../pr-3197/signal-scan-terminal-failure.png | Bin 0 -> 121116 bytes specs/security-moderation.md | 12 +- src/routes/-management.test.tsx | 67 +++++ src/routes/-management/AbusePage.tsx | 41 ++- src/styles.css | 31 ++ 10 files changed, 704 insertions(+), 50 deletions(-) create mode 100644 proof/pr-3197/signal-scan-terminal-failure.png diff --git a/convex/publisherAbuse.test.ts b/convex/publisherAbuse.test.ts index acbfc19d..9e8a6f8c 100644 --- a/convex/publisherAbuse.test.ts +++ b/convex/publisherAbuse.test.ts @@ -683,7 +683,11 @@ function makeEmptyPublisherAbuseScoreRunsQuery() { indexName: string, build: (q: { eq: (field: string, value: unknown) => unknown }) => unknown, ) => { - expect(indexName).toBe("by_model_version_and_started_at"); + expect([ + "by_model_version_and_started_at", + "by_temporal_pipeline_kind_and_started_at", + "by_model_version_and_temporal_pipeline_kind_and_phase_started_at", + ]).toContain(indexName); const constraints: Record = {}; const q = { eq(field: string, value: unknown) { @@ -692,7 +696,15 @@ function makeEmptyPublisherAbuseScoreRunsQuery() { }, }; build(q); - expect(constraints.modelVersion).toBeTypeOf("string"); + if (indexName === "by_model_version_and_started_at") { + expect(constraints.modelVersion).toBeTypeOf("string"); + } else if (indexName === "by_model_version_and_temporal_pipeline_kind_and_phase_started_at") { + expect(constraints.modelVersion).toBeTypeOf("string"); + expect(constraints.temporalPipelineKind).toBeUndefined(); + expect(constraints.temporalPipelinePhase).toBeTypeOf("string"); + } else { + expect(constraints).toEqual({ temporalPipelineKind: "signals" }); + } return { order: (direction: "asc" | "desc") => { expect(direction).toBe("desc"); @@ -807,6 +819,7 @@ describe("publisher abuse dry-run persistence", () => { listDashboardHandler({ db: { get: dbGet, query: dbQuery } }, {}), ).resolves.toEqual({ latestRun: null, + latestSignalRun: null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], @@ -872,6 +885,7 @@ describe("publisher abuse dry-run persistence", () => { await expect(listDashboardHandler({ db }, {})).resolves.toEqual({ latestRun: null, + latestSignalRun: null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], @@ -1622,6 +1636,7 @@ describe("publisher abuse dry-run persistence", () => { await expect(listDashboardHandler({ db }, {})).resolves.toEqual({ latestRun: null, + latestSignalRun: null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], @@ -1689,6 +1704,85 @@ describe("publisher abuse dry-run persistence", () => { expect(db.get).not.toHaveBeenCalled(); }); + it("keeps a resumable legacy signal scan visible behind a newer diagnostic run", async () => { + vi.mocked(requireUser).mockResolvedValue({ + userId: "users:moderator", + user: { _id: "users:moderator", role: "moderator" }, + } as never); + const legacySignalRun = { + _id: "publisherAbuseScoreRuns:legacy-signal", + modelVersion: "publisher-abuse-temporal.v1", + status: "running", + phase: "collecting", + trigger: "cron", + startedAt: 200, + updatedAt: 200, + temporalPipelinePhase: "collecting", + }; + const newerDiagnosticRun = { + ...legacySignalRun, + _id: "publisherAbuseScoreRuns:newer-diagnostic", + startedAt: 300, + updatedAt: 300, + temporalPipelinePhase: undefined, + }; + const db = { + get: vi.fn(async () => null), + query: vi.fn((table: string) => { + if (table === "publisherAbuseScoreRuns") { + return { + withIndex: ( + indexName: string, + build: (q: { eq: (field: string, value: unknown) => unknown }) => unknown, + ) => { + const constraints: Record = {}; + const q = { + eq(field: string, value: unknown) { + constraints[field] = value; + return q; + }, + }; + build(q); + return { + order: () => ({ + first: async () => { + if (indexName === "by_temporal_pipeline_kind_and_started_at") return null; + if ( + indexName === + "by_model_version_and_temporal_pipeline_kind_and_phase_started_at" + ) { + return constraints.modelVersion === "publisher-abuse-temporal.v1" && + constraints.temporalPipelineKind === undefined && + constraints.temporalPipelinePhase === "collecting" + ? legacySignalRun + : null; + } + return constraints.modelVersion === "publisher-abuse-temporal.v1" + ? newerDiagnosticRun + : null; + }, + }), + }; + }, + }; + } + if (table === "publisherAbuseReviewNominations") { + return makePublisherAbuseNominationCountQuery([]); + } + if (table === "publisherAbuseSignals") return makePublisherAbuseSignalCountQuery([]); + if (table === "officialPublishers") return makeEmptyOfficialPublishersQuery(); + throw new Error(`unexpected table ${table}`); + }), + }; + + await expect(listDashboardHandler({ db }, {})).resolves.toEqual( + expect.objectContaining({ + latestRun: expect.objectContaining({ _id: legacySignalRun._id }), + latestSignalRun: expect.objectContaining({ _id: legacySignalRun._id }), + }), + ); + }); + it("counts only visible publisher abuse nominations on the dashboard", async () => { vi.mocked(requireUser).mockResolvedValue({ userId: "users:moderator", @@ -1830,6 +1924,7 @@ describe("publisher abuse dry-run persistence", () => { await expect(listDashboardHandler({ db }, {})).resolves.toEqual({ latestRun: null, + latestSignalRun: null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], @@ -1921,6 +2016,7 @@ describe("publisher abuse dry-run persistence", () => { await expect(listDashboardHandler({ db }, {})).resolves.toEqual({ latestRun: null, + latestSignalRun: null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], diff --git a/convex/publisherAbuse.ts b/convex/publisherAbuse.ts index 14a5e038..79fdf7af 100644 --- a/convex/publisherAbuse.ts +++ b/convex/publisherAbuse.ts @@ -334,14 +334,21 @@ export const listReviewDashboard = query({ const auth = await requirePublisherAbuseDashboardUser(ctx); if (!auth) return emptyPublisherAbuseReviewDashboard(); - const [latestRun, nominationCountSummary, signalCountSummary] = await Promise.all([ - getLatestPublisherAbuseScoreRun(ctx), - getPublisherAbuseReviewNominationCountSummary(ctx), - getPublisherAbuseSignalCountSummary(ctx), - ]); + const [latestPressureRun, latestSignalRun, nominationCountSummary, signalCountSummary] = + await Promise.all([ + getLatestPublisherAbuseScoreRunForModel( + ctx, + DEFAULT_PUBLISHER_ABUSE_MODEL_CONFIG.modelVersion, + ), + getLatestPublisherAbuseSignalRun(ctx), + getPublisherAbuseReviewNominationCountSummary(ctx), + getPublisherAbuseSignalCountSummary(ctx), + ]); + const latestRun = newerPublisherAbuseRun(latestPressureRun, latestSignalRun); return { latestRun: latestRun ? summarizePublisherAbuseRun(latestRun) : null, + latestSignalRun: latestSignalRun ? summarizePublisherAbuseRun(latestSignalRun) : null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], @@ -528,6 +535,7 @@ async function requirePublisherAbuseDashboardUser(ctx: QueryCtx) { function emptyPublisherAbuseReviewDashboard() { return { latestRun: null, + latestSignalRun: null, pendingItems: [], pendingPotentialBanCandidateItems: [], pendingReviewItems: [], @@ -4119,18 +4127,10 @@ async function getPublisherAbuseReviewItemsPageFromPendingNominations( }; } -async function getLatestPublisherAbuseScoreRun(ctx: QueryCtx) { - const pressureRun = await getLatestPublisherAbuseScoreRunForModel( - ctx, - DEFAULT_PUBLISHER_ABUSE_MODEL_CONFIG.modelVersion, - ); - const temporalRun = await getLatestPublisherAbuseScoreRunForModel( - ctx, - PUBLISHER_TEMPORAL_ABUSE_MODEL_VERSION, - ); - if (!pressureRun) return temporalRun; - if (!temporalRun) return pressureRun; - return temporalRun.startedAt > pressureRun.startedAt ? temporalRun : pressureRun; +function newerPublisherAbuseRun(left: ScoreRun | null, right: ScoreRun | null) { + if (!left) return right; + if (!right) return left; + return right.startedAt > left.startedAt ? right : left; } async function getLatestPublisherAbuseScoreRunForModel(ctx: QueryCtx, modelVersion: string) { @@ -4141,6 +4141,42 @@ async function getLatestPublisherAbuseScoreRunForModel(ctx: QueryCtx, modelVersi .first(); } +async function getLatestPublisherAbuseSignalRun(ctx: QueryCtx) { + const legacyTemporalPhases = [ + "collecting", + "downloads_percentiles", + "spike_percentiles", + "classifying", + "completed", + ] as const; + const [taggedRun, legacyRuns] = await Promise.all([ + ctx.db + .query("publisherAbuseScoreRuns") + .withIndex("by_temporal_pipeline_kind_and_started_at", (q) => + q.eq("temporalPipelineKind", "signals"), + ) + .order("desc") + .first(), + Promise.all( + legacyTemporalPhases.map( + async (temporalPipelinePhase) => + await ctx.db + .query("publisherAbuseScoreRuns") + .withIndex("by_model_version_and_temporal_pipeline_kind_and_phase_started_at", (q) => + q + .eq("modelVersion", PUBLISHER_TEMPORAL_ABUSE_MODEL_VERSION) + .eq("temporalPipelineKind", undefined) + .eq("temporalPipelinePhase", temporalPipelinePhase), + ) + .order("desc") + .first(), + ), + ), + ]); + const legacyRun = legacyRuns.reduce(newerPublisherAbuseRun, null); + return newerPublisherAbuseRun(taggedRun, legacyRun); +} + async function getRecentResolvedPublisherAbuseReviewItems( ctx: QueryCtx, limit: number, diff --git a/convex/publisherAbuseTemporalScan.test.ts b/convex/publisherAbuseTemporalScan.test.ts index 3fcc4e51..f33bbd00 100644 --- a/convex/publisherAbuseTemporalScan.test.ts +++ b/convex/publisherAbuseTemporalScan.test.ts @@ -13,6 +13,7 @@ import { advanceScheduledTemporalCandidatesInternalHandler, getOrStartScheduledTemporalScanInternalHandler, markScheduledTemporalScanFailedInternalHandler, + recordScheduledTemporalScanFailureInternalHandler, percentileIndex, pruneExpiredTemporalScanRowsInternalHandler, runScheduledTemporalPublisherAbuseScanInternalHandler, @@ -197,6 +198,7 @@ describe("scheduled temporal publisher abuse scan", () => { })), insert, }, + scheduler: { runAfter: vi.fn(async () => null) }, }; await expect( @@ -220,10 +222,16 @@ describe("scheduled temporal publisher abuse scan", () => { ); }); - it("does not take over an active cron scan when a moderator requests a rescan", async () => { + it("does not replace a recently quiet cron scan when a moderator requests a rescan", async () => { const actorUserId = "users:moderator" as Id<"users">; - const existing = temporalRun({ trigger: "cron", actorUserId: undefined }); - const patch = vi.fn(async () => null); + const now = Date.now(); + const existing = temporalRun({ + trigger: "cron", + actorUserId: undefined, + startedAt: now - 4 * 24 * 60 * 60 * 1_000, + updatedAt: now - 14 * 60 * 1_000, + }); + const patch = vi.fn(async (_id: unknown, _value: unknown) => null); const ctx = { db: { query: vi.fn(() => ({ @@ -245,6 +253,55 @@ describe("scheduled temporal publisher abuse scan", () => { expect(patch).not.toHaveBeenCalled(); }); + it("retries the same signal scan after fifteen minutes without progress", async () => { + const now = Date.now(); + const existing = temporalRun({ + temporalPipelineKind: undefined, + startedAt: now - 4 * 24 * 60 * 60 * 1_000, + updatedAt: now - 16 * 60 * 1_000, + }); + const patch = vi.fn(async (_id: unknown, _value: unknown) => null); + const insert = vi.fn(); + const scheduler = { runAfter: vi.fn(async () => null) }; + let queryCount = 0; + const ctx = { + db: { + query: vi.fn(() => ({ + withIndex: vi.fn(() => ({ + order: vi.fn(() => ({ + first: vi.fn(async () => { + queryCount += 1; + return queryCount === 1 ? null : existing; + }), + })), + })), + })), + get: vi.fn(async () => existing), + patch, + insert, + }, + scheduler, + }; + + await expect( + getOrStartScheduledTemporalScanInternalHandler(ctx as unknown as MutationCtx, { + trigger: "manual", + actorUserId: "users:moderator" as Id<"users">, + }), + ).resolves.toEqual({ runId: existing._id, resumed: true }); + + expect(patch).toHaveBeenCalledWith( + existing._id, + expect.objectContaining({ + transientErrorCount: 1, + lastTransientError: expect.stringContaining("fifteen minutes"), + }), + ); + expect(patch.mock.calls[0]?.[1]).not.toHaveProperty("status"); + expect(insert).not.toHaveBeenCalled(); + expect(scheduler.runAfter).toHaveBeenCalledTimes(2); + }); + it("does not launch a second worker for an already-running signal scan", async () => { const existing = temporalRun({ trigger: "cron" }); const runMutation = vi.fn(async () => ({ runId: existing._id, resumed: true })); @@ -347,8 +404,13 @@ describe("scheduled temporal publisher abuse scan", () => { }); }); - it("persists one bounded source page and advances its durable cursor", async () => { - const run = temporalRun(); + it("persists one bounded source page, advances its cursor, and clears the failure streak", async () => { + const run = temporalRun({ + transientErrorCount: 2, + lastTransientError: "previous failure", + lastTransientErrorAt: Date.now() - 1_000, + nextTransientRetryAt: Date.now() + 30_000, + }); const insert = vi.fn(async () => "inserted"); const patch = vi.fn(async () => null); const ctx = { @@ -390,6 +452,10 @@ describe("scheduled temporal publisher abuse scan", () => { temporalSampleSize: 2, temporalDownloadsSum: 100, temporalPipelinePhase: "collecting", + transientErrorCount: 0, + lastTransientError: undefined, + lastTransientErrorAt: undefined, + nextTransientRetryAt: undefined, }), ); }); @@ -459,11 +525,14 @@ describe("scheduled temporal publisher abuse scan", () => { }); }); - it("marks a scheduled scan failed when a scan step throws", async () => { + it("retries a scheduled scan step failure without discarding saved progress", async () => { const run = temporalRun(); const scanError = new Error("invalid benchmark payload"); const runQuery = vi.fn().mockResolvedValueOnce(run).mockRejectedValueOnce(scanError); - const runMutation = vi.fn(async (_target: unknown, _args: unknown) => ({ failed: true })); + const runMutation = vi.fn(async (_target: unknown, _args: unknown) => ({ + outcome: "retry_scheduled", + failureCount: 1, + })); const scheduler = { runAfter: vi.fn(async () => null) }; const handler = runScheduledTemporalPublisherAbuseScanInternalHandler as unknown as ( ctx: { @@ -474,17 +543,78 @@ describe("scheduled temporal publisher abuse scan", () => { args: { runId?: Id<"publisherAbuseScoreRuns"> }, ) => Promise; - await expect(handler({ runQuery, runMutation, scheduler }, { runId: run._id })).rejects.toThrow( - "invalid benchmark payload", - ); + await expect( + handler({ runQuery, runMutation, scheduler }, { runId: run._id }), + ).resolves.toEqual({ + ok: true, + runId: run._id, + completed: false, + phase: "collecting", + retrying: true, + }); expect(runMutation).toHaveBeenCalledTimes(1); expect(runMutation.mock.calls[0]?.[1]).toEqual({ runId: run._id, + expectedUpdatedAt: run.updatedAt, errorMessage: "invalid benchmark payload", }); }); + it("stops a scheduled scan after its fifth consecutive failed attempt", async () => { + const run = temporalRun({ + transientErrorCount: 4, + lastTransientError: "fourth failure", + }); + const patch = vi.fn(async () => null); + const scheduler = { runAfter: vi.fn(async () => null) }; + const ctx = { db: { get: vi.fn(async () => run), patch }, scheduler }; + + await expect( + recordScheduledTemporalScanFailureInternalHandler(ctx as unknown as MutationCtx, { + runId: run._id, + expectedUpdatedAt: run.updatedAt, + errorMessage: "fifth failure", + }), + ).resolves.toEqual({ outcome: "failed", failureCount: 5 }); + + expect(patch).toHaveBeenCalledWith( + run._id, + expect.objectContaining({ + status: "failed", + temporalScanComplete: false, + transientErrorCount: 5, + lastTransientError: "fifth failure", + errorMessage: "fifth failure", + }), + ); + expect(scheduler.runAfter).not.toHaveBeenCalled(); + }); + + it("schedules the next saved-page attempt after a non-terminal failure", async () => { + const run = temporalRun({ transientErrorCount: 2 }); + const patch = vi.fn(async () => null); + const scheduler = { runAfter: vi.fn(async () => null) }; + const ctx = { db: { get: vi.fn(async () => run), patch }, scheduler }; + + await expect( + recordScheduledTemporalScanFailureInternalHandler(ctx as unknown as MutationCtx, { + runId: run._id, + expectedUpdatedAt: run.updatedAt, + errorMessage: "third failure", + }), + ).resolves.toEqual({ outcome: "retry_scheduled", failureCount: 3 }); + + expect(patch).toHaveBeenCalledWith( + run._id, + expect.objectContaining({ + transientErrorCount: 3, + lastTransientError: "third failure", + }), + ); + expect(scheduler.runAfter).toHaveBeenCalledWith(120_000, expect.anything(), { runId: run._id }); + }); + it("persists a failed terminal state for an active scheduled scan", async () => { const run = temporalRun(); const patch = vi.fn(async () => null); diff --git a/convex/publisherAbuseTemporalScan.ts b/convex/publisherAbuseTemporalScan.ts index 6c9128d1..176c17e3 100644 --- a/convex/publisherAbuseTemporalScan.ts +++ b/convex/publisherAbuseTemporalScan.ts @@ -23,6 +23,10 @@ const SOURCE_PAGE_SIZE = 50; const PERCENTILE_PAGE_SIZE = 500; const CANDIDATE_PAGE_SIZE = 100; const TEMPORAL_SCAN_RETENTION_MS = 7 * 24 * 60 * 60 * 1000; +const TEMPORAL_SCAN_HEARTBEAT_TIMEOUT_MS = 15 * 60 * 1000; +const TEMPORAL_SCAN_RETRY_BASE_DELAY_MS = 30 * 1000; +const TEMPORAL_SCAN_RETRY_MAX_DELAY_MS = 5 * 60 * 1000; +const MAX_TEMPORAL_SCAN_FAILURE_ATTEMPTS = 5; const temporalCohortBandValidator = v.union(v.literal("p95"), v.literal("p99")); const temporalScoreValidator = v.object({ @@ -86,6 +90,19 @@ function isActiveScheduledTemporalRun(run: TemporalScanRun, now: number) { return run.status === "running" && now - run.startedAt < TEMPORAL_SCAN_RETENTION_MS; } +function temporalScanRetryDelayMs(failureCount: number) { + return Math.min( + TEMPORAL_SCAN_RETRY_BASE_DELAY_MS * 2 ** Math.max(0, failureCount - 1), + TEMPORAL_SCAN_RETRY_MAX_DELAY_MS, + ); +} + +function temporalScanHeartbeatDueAt(run: TemporalScanRun) { + return ( + Math.max(run.updatedAt, run.nextTransientRetryAt ?? 0) + TEMPORAL_SCAN_HEARTBEAT_TIMEOUT_MS + ); +} + export async function getOrStartScheduledTemporalScanInternalHandler( ctx: MutationCtx, args: { trigger?: "cron" | "manual"; actorUserId?: Id<"users"> }, @@ -112,13 +129,38 @@ export async function getOrStartScheduledTemporalScanInternalHandler( .first(); const existing = currentPipeline ?? (legacyCronPipeline?.temporalPipelinePhase ? legacyCronPipeline : null); + const withinWorkingStateRetention = + existing !== null && now - existing.startedAt < TEMPORAL_SCAN_RETENTION_MS; + const shouldRetryStaleRun = + existing?.temporalPipelinePhase !== undefined && + existing.temporalPipelinePhase !== "completed" && + withinWorkingStateRetention && + now >= temporalScanHeartbeatDueAt(existing); if ( existing?.temporalPipelinePhase && existing.temporalPipelinePhase !== "completed" && - now - existing.startedAt < TEMPORAL_SCAN_RETENTION_MS + withinWorkingStateRetention && + !shouldRetryStaleRun ) { return { runId: existing._id, resumed: true as const }; } + if (existing && shouldRetryStaleRun) { + const retry = await recordScheduledTemporalScanFailureInternalHandler(ctx, { + runId: existing._id, + expectedUpdatedAt: existing.updatedAt, + errorMessage: "Signal scan reported no progress for fifteen minutes.", + }); + if (retry.outcome === "retry_scheduled") { + await ctx.scheduler.runAfter( + temporalScanRetryDelayMs(retry.failureCount) + TEMPORAL_SCAN_HEARTBEAT_TIMEOUT_MS, + internal.publisherAbuseTemporalScan.monitorScheduledTemporalScanInternal, + { runId: existing._id }, + ); + } + // On failure five, the action re-reads this run and surfaces its terminal + // error. A later independent trigger may start a new scan; this one stops. + return { runId: existing._id, resumed: true as const }; + } if (existing) { await ctx.db.patch(existing._id, { status: "failed", @@ -154,6 +196,11 @@ export async function getOrStartScheduledTemporalScanInternalHandler( temporalDownloadsProcessed: 0, temporalSpikeProcessed: 0, }); + await ctx.scheduler.runAfter( + TEMPORAL_SCAN_HEARTBEAT_TIMEOUT_MS, + internal.publisherAbuseTemporalScan.monitorScheduledTemporalScanInternal, + { runId }, + ); return { runId, resumed: false as const }; } @@ -223,6 +270,10 @@ export async function storeScheduledTemporalScanPageInternalHandler( (run.temporalDownloadsSum ?? 0) + args.benchmarkScores.reduce((sum, score) => sum + Math.max(0, score.recent30Downloads), 0), temporalPipelinePhase: args.isDone ? "downloads_percentiles" : "collecting", + transientErrorCount: 0, + lastTransientError: undefined, + lastTransientErrorAt: undefined, + nextTransientRetryAt: undefined, updatedAt: now, }); return { applied: true as const }; @@ -325,6 +376,10 @@ export async function advanceScheduledTemporalPercentileInternalHandler( temporalDownloadsP95: args.p95 ?? run.temporalDownloadsP95, temporalDownloadsP99: args.p99 ?? run.temporalDownloadsP99, temporalPipelinePhase: args.isDone ? "spike_percentiles" : args.phase, + transientErrorCount: 0, + lastTransientError: undefined, + lastTransientErrorAt: undefined, + nextTransientRetryAt: undefined, updatedAt: now, }); return { applied: true as const }; @@ -341,6 +396,10 @@ export async function advanceScheduledTemporalPercentileInternalHandler( temporalSpikeP99: spikeP99, temporalBenchmark: benchmark, temporalPipelinePhase: args.isDone ? "classifying" : args.phase, + transientErrorCount: 0, + lastTransientError: undefined, + lastTransientErrorAt: undefined, + nextTransientRetryAt: undefined, updatedAt: now, }); return { applied: true as const }; @@ -456,6 +515,10 @@ export async function advanceScheduledTemporalCandidatesInternalHandler( completedAt: args.isDone ? now : undefined, finalizedScores, reviewCount: finalizedScores, + transientErrorCount: 0, + lastTransientError: undefined, + lastTransientErrorAt: undefined, + nextTransientRetryAt: undefined, updatedAt: now, }); return { applied: true as const }; @@ -518,6 +581,119 @@ export const markScheduledTemporalScanFailedInternal = internalMutation({ handler: markScheduledTemporalScanFailedInternalHandler, }); +type ScheduledTemporalScanFailureResult = + | { outcome: "inactive" } + | { outcome: "retry_scheduled"; failureCount: number } + | { outcome: "failed"; failureCount: number }; + +export async function recordScheduledTemporalScanFailureInternalHandler( + ctx: MutationCtx, + args: { + runId: Id<"publisherAbuseScoreRuns">; + expectedUpdatedAt: number; + errorMessage: string; + }, +): Promise { + const run = await getScheduledTemporalScanStateInternalHandler(ctx, { runId: args.runId }); + if (run.status !== "running" || run.updatedAt !== args.expectedUpdatedAt) { + return { outcome: "inactive" }; + } + + const now = Date.now(); + const failureCount = (run.transientErrorCount ?? 0) + 1; + const failureTelemetry = { + transientErrorCount: failureCount, + lastTransientError: args.errorMessage, + lastTransientErrorAt: now, + updatedAt: now, + }; + if (failureCount >= MAX_TEMPORAL_SCAN_FAILURE_ATTEMPTS) { + await ctx.db.patch(run._id, { + ...failureTelemetry, + status: "failed", + temporalScanComplete: false, + errorMessage: args.errorMessage, + nextTransientRetryAt: undefined, + }); + console.error("[publisher-temporal-abuse-scan] retry budget exhausted", { + event: "publisher_temporal_abuse_scan_failed", + runId: run._id, + failureCount, + errorMessage: args.errorMessage, + }); + return { outcome: "failed", failureCount }; + } + + const retryDelayMs = temporalScanRetryDelayMs(failureCount); + await ctx.db.patch(run._id, { + ...failureTelemetry, + errorMessage: undefined, + nextTransientRetryAt: now + retryDelayMs, + }); + await ctx.scheduler.runAfter( + retryDelayMs, + internal.publisherAbuseTemporalScan.runScheduledTemporalPublisherAbuseScanInternal, + { runId: run._id }, + ); + console.warn("[publisher-temporal-abuse-scan] scan step failed; retrying", { + runId: run._id, + failureCount, + maxFailureAttempts: MAX_TEMPORAL_SCAN_FAILURE_ATTEMPTS, + retryDelayMs, + errorMessage: args.errorMessage, + }); + return { outcome: "retry_scheduled", failureCount }; +} + +export const recordScheduledTemporalScanFailureInternal = internalMutation({ + args: { + runId: v.id("publisherAbuseScoreRuns"), + expectedUpdatedAt: v.number(), + errorMessage: v.string(), + }, + handler: recordScheduledTemporalScanFailureInternalHandler, +}); + +export async function monitorScheduledTemporalScanInternalHandler( + ctx: MutationCtx, + args: { runId: Id<"publisherAbuseScoreRuns"> }, +) { + const run = await getScheduledTemporalScanStateInternalHandler(ctx, args); + if (run.status !== "running" || run.temporalPipelinePhase === "completed") { + return { outcome: "inactive" as const }; + } + + const now = Date.now(); + const heartbeatDueAt = temporalScanHeartbeatDueAt(run); + if (now < heartbeatDueAt) { + await ctx.scheduler.runAfter( + heartbeatDueAt - now, + internal.publisherAbuseTemporalScan.monitorScheduledTemporalScanInternal, + args, + ); + return { outcome: "waiting" as const }; + } + + const failure = await recordScheduledTemporalScanFailureInternalHandler(ctx, { + runId: run._id, + expectedUpdatedAt: run.updatedAt, + errorMessage: "Signal scan reported no progress for fifteen minutes.", + }); + if (failure.outcome === "retry_scheduled") { + await ctx.scheduler.runAfter( + temporalScanRetryDelayMs(failure.failureCount) + TEMPORAL_SCAN_HEARTBEAT_TIMEOUT_MS, + internal.publisherAbuseTemporalScan.monitorScheduledTemporalScanInternal, + args, + ); + } + return failure; +} + +export const monitorScheduledTemporalScanInternal = internalMutation({ + args: { runId: v.id("publisherAbuseScoreRuns") }, + handler: monitorScheduledTemporalScanInternalHandler, +}); + type TemporalSourcePage = { cursor?: string; isDone: boolean; @@ -530,6 +706,14 @@ type PercentilePage = { values: number[]; cursor?: string; isDone: boolean }; type CandidatePage = { candidates: TemporalSkillCandidate[]; cursor?: string; isDone: boolean }; type ScheduledTemporalScanResult = | { ok: true; runId: Id<"publisherAbuseScoreRuns">; completed: true } + | { + ok: false; + runId: Id<"publisherAbuseScoreRuns">; + completed: false; + failed: true; + failureCount: number; + errorMessage: string; + } | { ok: false; runId: Id<"publisherAbuseScoreRuns">; @@ -542,16 +726,19 @@ type ScheduledTemporalScanResult = completed: false; phase: Exclude; alreadyRunning?: true; + retrying?: true; }; async function runScheduledTemporalPublisherAbuseScanStep( ctx: ActionCtx, runId: Id<"publisherAbuseScoreRuns">, + initialRun?: TemporalScanRun, ): Promise { - const run: TemporalScanRun = await ctx.runQuery( - internal.publisherAbuseTemporalScan.getScheduledTemporalScanStateInternal, - { runId }, - ); + const run: TemporalScanRun = + initialRun ?? + (await ctx.runQuery(internal.publisherAbuseTemporalScan.getScheduledTemporalScanStateInternal, { + runId, + })); if (run.status !== "running" || run.temporalPipelinePhase === "completed") { return { ok: true as const, runId: run._id, completed: true as const }; } @@ -584,7 +771,7 @@ async function runScheduledTemporalPublisherAbuseScanStep( recent30Downloads, spikeMultiplier, })); - await ctx.runMutation( + const stored: { applied: boolean } = await ctx.runMutation( internal.publisherAbuseTemporalScan.storeScheduledTemporalScanPageInternal, { runId: run._id, @@ -595,6 +782,15 @@ async function runScheduledTemporalPublisherAbuseScanStep( candidates: sourcePage.candidates, }, ); + if (!stored.applied) { + return { + ok: true, + runId: run._id, + completed: false, + phase: run.temporalPipelinePhase, + alreadyRunning: true, + }; + } } else if ( run.temporalPipelinePhase === "downloads_percentiles" || run.temporalPipelinePhase === "spike_percentiles" @@ -629,7 +825,7 @@ async function runScheduledTemporalPublisherAbuseScanStep( targetIndex: percentileIndex(sampleSize, 0.5), }) : undefined; - await ctx.runMutation( + const advanced: { applied: boolean } = await ctx.runMutation( internal.publisherAbuseTemporalScan.advanceScheduledTemporalPercentileInternal, { runId: run._id, @@ -643,6 +839,15 @@ async function runScheduledTemporalPublisherAbuseScanStep( p99: sampleSize === 0 ? 0 : p99, }, ); + if (!advanced.applied) { + return { + ok: true, + runId: run._id, + completed: false, + phase: run.temporalPipelinePhase, + alreadyRunning: true, + }; + } } else if (run.temporalPipelinePhase === "classifying") { if (!run.temporalBenchmark) throw new Error("Temporal scan benchmark is missing"); const page: CandidatePage = await ctx.runQuery( @@ -665,7 +870,7 @@ async function runScheduledTemporalPublisherAbuseScanStep( ({ temporalScore }) => temporalScore.spike || temporalScore.sustained || temporalScore.nearConversion, ); - await ctx.runMutation( + const advanced: { applied: boolean } = await ctx.runMutation( internal.publisherAbuseTemporalScan.advanceScheduledTemporalCandidatesInternal, { runId: run._id, @@ -675,6 +880,15 @@ async function runScheduledTemporalPublisherAbuseScanStep( candidates: highCandidates, }, ); + if (!advanced.applied) { + return { + ok: true, + runId: run._id, + completed: false, + phase: run.temporalPipelinePhase, + alreadyRunning: true, + }; + } if (page.isDone) { await ctx.scheduler.runAfter( 0, @@ -738,15 +952,53 @@ export async function runScheduledTemporalPublisherAbuseScanInternalHandler( alreadyRunning: true, }; } + const runAtAttemptStart: TemporalScanRun = await ctx.runQuery( + internal.publisherAbuseTemporalScan.getScheduledTemporalScanStateInternal, + { runId: start.runId }, + ); try { - return await runScheduledTemporalPublisherAbuseScanStep(ctx, start.runId); + return await runScheduledTemporalPublisherAbuseScanStep(ctx, start.runId, runAtAttemptStart); } catch (error) { const errorMessage = (error instanceof Error ? error.message : String(error)).slice(0, 2_000); + const retryPhase = + runAtAttemptStart.temporalPipelinePhase === "completed" + ? "collecting" + : (runAtAttemptStart.temporalPipelinePhase ?? "collecting"); try { - await ctx.runMutation( - internal.publisherAbuseTemporalScan.markScheduledTemporalScanFailedInternal, - { runId: start.runId, errorMessage }, + const failure: ScheduledTemporalScanFailureResult = await ctx.runMutation( + internal.publisherAbuseTemporalScan.recordScheduledTemporalScanFailureInternal, + { + runId: start.runId, + expectedUpdatedAt: runAtAttemptStart.updatedAt, + errorMessage, + }, ); + if (failure.outcome === "retry_scheduled") { + return { + ok: true, + runId: start.runId, + completed: false, + phase: retryPhase, + retrying: true, + }; + } + if (failure.outcome === "inactive") { + return { + ok: true, + runId: start.runId, + completed: false, + phase: retryPhase, + alreadyRunning: true, + }; + } + return { + ok: false, + runId: start.runId, + completed: false, + failed: true, + failureCount: failure.failureCount, + errorMessage, + }; } catch (recordError) { console.error("[publisher-temporal-abuse-scan] Failed to persist scan failure", { runId: start.runId, diff --git a/convex/schema.ts b/convex/schema.ts index d4294b3f..83b76383 100644 --- a/convex/schema.ts +++ b/convex/schema.ts @@ -2830,6 +2830,13 @@ const publisherAbuseScoreRuns = defineTable({ "status", "updatedAt", ]) + .index("by_temporal_pipeline_kind_and_started_at", ["temporalPipelineKind", "startedAt"]) + .index("by_model_version_and_temporal_pipeline_kind_and_phase_started_at", [ + "modelVersion", + "temporalPipelineKind", + "temporalPipelinePhase", + "startedAt", + ]) .index("by_model_status_phase_temporal_complete_started_at", [ "modelVersion", "status", diff --git a/proof/pr-3197/signal-scan-terminal-failure.png b/proof/pr-3197/signal-scan-terminal-failure.png new file mode 100644 index 0000000000000000000000000000000000000000..25f1f9b997c227c6c6182b8d6a96e9271d90b448 GIT binary patch literal 121116 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 { expect(screen.getByText("Re-checks every active skill")).toBeTruthy(); }); + it("shows the terminal signal scan error after five failed attempts", () => { + searchState = { view: "abuse", tab: "signals" }; + useQueryMock.mockImplementation((query, args) => { + if (args === "skip") return undefined; + const name = getFunctionName(query); + if (name === "skills:listRecentVersions") return []; + if (name === "skills:listReportedSkills") return []; + if (name === "skills:listDuplicateCandidates") return []; + if (name === "publisherAbuse:listReviewDashboard") { + return { + latestRun: null, + latestSignalRun: { + status: "failed", + scannedPublishers: 120, + scoredPublishers: 0, + transientErrorCount: 5, + errorMessage: "Query exceeded the document read limit.", + }, + pendingItems: [], + pendingPotentialBanCandidateItems: [], + pendingReviewItems: [], + recentResolvedItems: [], + }; + } + if (name === "users:list") return { items: [], total: 0 }; + return undefined; + }); + + render(); + + expect(screen.getByText("Stopped after 5 failed attempts")).toBeTruthy(); + expect(screen.getByText("Query exceeded the document read limit.")).toBeTruthy(); + }); + + it("does not show a retry warning for a completed signal scan", () => { + searchState = { view: "abuse", tab: "signals" }; + useQueryMock.mockImplementation((query, args) => { + if (args === "skip") return undefined; + const name = getFunctionName(query); + if (name === "skills:listRecentVersions") return []; + if (name === "skills:listReportedSkills") return []; + if (name === "skills:listDuplicateCandidates") return []; + if (name === "publisherAbuse:listReviewDashboard") { + return { + latestRun: null, + latestSignalRun: { + status: "completed", + scannedPublishers: 120, + scoredPublishers: 12, + transientErrorCount: 1, + lastTransientError: "Temporary timeout.", + }, + pendingItems: [], + pendingPotentialBanCandidateItems: [], + pendingReviewItems: [], + recentResolvedItems: [], + }; + } + if (name === "users:list") return { items: [], total: 0 }; + return undefined; + }); + + render(); + + expect(screen.queryByText("Retrying after 1 of 5 failed attempts")).toBeNull(); + }); + it("shows users as a separate management view", () => { searchState = { view: "users" }; diff --git a/src/routes/-management/AbusePage.tsx b/src/routes/-management/AbusePage.tsx index 232071b8..8031e731 100644 --- a/src/routes/-management/AbusePage.tsx +++ b/src/routes/-management/AbusePage.tsx @@ -131,6 +131,9 @@ export function AbusePage({ } }, [selectedSignalId, signalItems, signalPageStatus, tab]); const latestRun = dashboard?.latestRun ?? null; + const latestSignalRun = dashboard?.latestSignalRun ?? null; + const displayedRun = tab === "signals" ? latestSignalRun : latestRun; + const signalFailureCount = latestSignalRun?.transientErrorCount ?? 0; const selectedScore = selectedItem?.latestScore ?? null; const selectedPublisher = selectedItem?.publisher ?? null; const canBanSelectedUser = canBanPublisherAbuseOwner(selectedItem, currentUserId); @@ -267,15 +270,15 @@ export function AbusePage({
Last scan
- {latestRun - ? formatPublisherAbuseRunStatus(latestRun.status) + {displayedRun + ? formatPublisherAbuseRunStatus(displayedRun.status) : dashboardLoaded ? "No scans yet" : "Loading"} @@ -283,11 +286,11 @@ export function AbusePage({
Scanned
-
{formatWholeNumber(latestRun?.scannedPublishers)}
+
{formatWholeNumber(displayedRun?.scannedPublishers)}
Scored
-
{formatWholeNumber(latestRun?.scoredPublishers)}
+
{formatWholeNumber(displayedRun?.scoredPublishers)}
@@ -318,6 +321,32 @@ export function AbusePage({
+ {tab === "signals" && latestSignalRun?.status === "failed" ? ( +
+
+ ) : tab === "signals" && latestSignalRun?.status === "running" && signalFailureCount > 0 ? ( +
+
+ ) : null} +
div, +.pa-scan-retrying > div { + display: grid; + gap: 2px; + min-width: 0; +} + +.pa-scan-failure span, +.pa-scan-retrying span { + overflow-wrap: anywhere; + color: var(--ink-soft); + font-size: var(--fs-sm); +} + +.pa-scan-retrying { + border-color: color-mix(in srgb, var(--oc-status-warning-fg) 30%, var(--line)); + background: var(--oc-status-warning-bg); + color: var(--oc-status-warning-fg); +} + .pa-tabs { display: flex; flex-wrap: wrap;