fix(sessions): outliers de duração ignoram outcome unknown e publicação no departamento Tecnologia (#14404)

This commit is contained in:
2026-10-28 16:00:49 +00:00
parent 948a9c2857
commit 2bbc12e8b4
2 changed files with 7 additions and 4 deletions
+5 -2
View File
@@ -188,7 +188,9 @@ export function detectSkillToolPairs(ctx: DetectCtx): Pattern[] {
}))
}
/** 4. Duration outliers: sessões > p95 por projecto com outcome != completed. */
/** 4. Duration outliers: sessões > p95 por projecto com outcome de falha medido (error/interrupted).
* `unknown` não conta: significa outcome não medido (ex.: sessões cron do Hermes, project_slug NULL,
* 100% `unknown`), e contá-lo gerava ~5% de "outliers" todas as semanas por construção (#14404). */
export function detectDurationOutliers(ctx: DetectCtx): Pattern[] {
const rows = baseRows(ctx).filter((r) => r.duration_sec != null && r.duration_sec > 0)
const byProject = new Map<string, Array<typeof rows[number]>>()
@@ -203,7 +205,8 @@ export function detectDurationOutliers(ctx: DetectCtx): Pattern[] {
const durations = arr.map((r) => r.duration_sec as number).sort((a, b) => a - b)
const p95Idx = Math.max(0, Math.floor(durations.length * 0.95) - 1)
const p95 = durations[p95Idx]
const outliers = arr.filter((r) => (r.duration_sec as number) > p95 && r.outcome !== 'completed')
const outliers = arr.filter((r) => (r.duration_sec as number) > p95 &&
r.outcome !== 'completed' && r.outcome !== 'unknown')
if (outliers.length < 3) continue
out.push({
pattern_key: `duration_outliers:${proj}`,