Skip to content
← Public packages

@kentcdodds/kody-issue-triage

Loop-safe triage for Kody run errors and fleet package-runtime error-rate elevations. Wakes Cole (Grok Bot) to decide; Cursor agents only when Cole escalates.

src/on-fleet-error-rate.ts

98 lines · 2.8 KB · TypeScript
import {
	fleetRateFingerprintFor,
	hourBucket,
	utcDayKey,
} from './shared.ts'
import { incrementCounter, initSchema, upsertFleetRateFingerprint } from './storage.ts'
import { scheduleEventSweep } from './schedule-event-sweep.ts'

export type FleetPackageErrorRateElevatedEvent = {
	event?: string
	event_id?: string
	status_url?: string
	insights_url?: string
	environment?: string
	observed_at?: string
	trigger?: {
		window?: string
		reason?: string
		recent?: {
			end?: string
			combined?: { events?: number; errors?: number; rate?: number | null }
		}
		previous?: {
			combined?: { events?: number; errors?: number; rate?: number | null }
		}
	}
	synthetic?: boolean
}

function formatRate(counts?: {
	events?: number
	errors?: number
	rate?: number | null
}) {
	const events = Number(counts?.events ?? 0)
	const errors = Number(counts?.errors ?? 0)
	const rate = counts?.rate
	const percent = rate == null ? 'n/a' : `${(rate * 100).toFixed(1)}%`
	return `${errors}/${events} (${percent})`
}

/**
 * Cheap `fleet.package_error_rate.elevated` handler. Fingerprint + counter
 * only. Never posts Discord or reads other users' Activity inline. Schedules a
 * guarded `./sweep` workflow so Patch can wake on the event path.
 */
export default async function onFleetPackageErrorRate(
	event: FleetPackageErrorRateElevatedEvent = {},
) {
	if (event.event !== 'fleet.package_error_rate.elevated') {
		return { ok: true, skipped: 'empty-event' }
	}
	const window = event.trigger?.window
	if (window !== 'hour' && window !== 'day') {
		return { ok: true, skipped: 'empty-event' }
	}

	const day = utcDayKey(event.observed_at || event.trigger?.recent?.end)
	const fingerprint = fleetRateFingerprintFor({ window, day })
	const message = [
		`Fleet user-package runtime error rate elevated (${window}, ${event.trigger?.reason || 'unknown'}).`,
		`Recent ${formatRate(event.trigger?.recent?.combined)}. Previous ${formatRate(event.trigger?.previous?.combined)}.`,
		event.insights_url ? `Insights ${event.insights_url}` : '',
		event.status_url ? `Status ${event.status_url}` : '',
		event.environment ? `Environment ${event.environment}` : '',
	]
		.filter(Boolean)
		.join(' ')

	await initSchema()
	const bucket = hourBucket()
	const upserted = await upsertFleetRateFingerprint({
		fingerprint,
		window,
		message,
		insightsUrl: event.insights_url || null,
	})
	const eventsThisHour = await incrementCounter(`events:${bucket}`)
	if (upserted.created) {
		await incrementCounter(`fingerprints:${bucket}`)
	}

	const sweep = await scheduleEventSweep({
		fingerprint: upserted.fingerprint,
		queued: true,
	})

	return {
		ok: true,
		queued: true,
		fingerprint: upserted.fingerprint,
		created: upserted.created,
		count: upserted.count,
		eventsThisHour,
		synthetic: event.synthetic === true,
		eventSweep: sweep,
	}
}