From 2bbc12e8b4ab32e8eb84e5a4a68c15cf67d2857f Mon Sep 17 00:00:00 2001 From: Emanuel Almeida Date: Wed, 28 Oct 2026 16:00:49 +0000 Subject: [PATCH] =?UTF-8?q?fix(sessions):=20outliers=20de=20dura=C3=A7?= =?UTF-8?q?=C3=A3o=20ignoram=20outcome=20unknown=20e=20publica=C3=A7=C3=A3?= =?UTF-8?q?o=20no=20departamento=20Tecnologia=20(#14404)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/scripts/sessions-patterns.ts | 4 ++-- api/services/sessions/patterns.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/api/scripts/sessions-patterns.ts b/api/scripts/sessions-patterns.ts index 237dae2..097f574 100644 --- a/api/scripts/sessions-patterns.ts +++ b/api/scripts/sessions-patterns.ts @@ -87,8 +87,8 @@ interface MCPToolCallResult { const OBSERVABILIDADE_STAFF_ID = 25 /** Discussão Desk onde os resumos semanais são publicados */ const OBSERVABILIDADE_DISCUSSION_ID = 32 -/** Departamento "Geral" no Desk CRM (id=1) */ -const OBSERVABILIDADE_DEPARTMENT_ID = 1 +/** Departamento "Tecnologia" no Desk CRM (id=7; o id=1 é "Comercial" — #14404) */ +const OBSERVABILIDADE_DEPARTMENT_ID = 7 function parseArgs(argv: string[]): Args { const a: Args = { publish: false, force: false, backfill: false } diff --git a/api/services/sessions/patterns.ts b/api/services/sessions/patterns.ts index dd4f522..ac93d98 100644 --- a/api/services/sessions/patterns.ts +++ b/api/services/sessions/patterns.ts @@ -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>() @@ -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}`,