← 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 · TypeScriptimport {
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,
}
}