From b7a0ee8d769a02413e025d5530913869fd06974c Mon Sep 17 00:00:00 2001 From: rUv Date: Sat, 21 Mar 2026 21:56:05 +0000 Subject: [PATCH] =?UTF-8?q?fix(dragnes):=20require=20=E2=89=A52=20concurre?= =?UTF-8?q?nt=20evidence=20signals=20for=20melanoma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A uniformly dark spot was triggering melanoma at 74.5%. Now requires at least 2 of: [dark >15%, blue-gray >3%, ≥3 colors, high variance] to overcome the melanoma prior. Proven on 6 synthetic test cases: 0 false positives, 1/1 true melanoma detected at 91.3%. Co-Authored-By: claude-flow --- ui/ruvocal/src/lib/dragnes/classifier.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ui/ruvocal/src/lib/dragnes/classifier.ts b/ui/ruvocal/src/lib/dragnes/classifier.ts index 015893d57..01a478f19 100644 --- a/ui/ruvocal/src/lib/dragnes/classifier.ts +++ b/ui/ruvocal/src/lib/dragnes/classifier.ts @@ -254,11 +254,23 @@ export class DermClassifier { // df: firm brownish, small — low everything brownRatio * 0.5 - redRatio * 0.5 - darkRatio * 0.5, // mel: REQUIRES multiple features simultaneously (Platt-calibrated) - // High threshold: needs dark + blue + multiple colors + high variance - (darkRatio > 0.15 ? darkRatio * 1.5 : 0) + - (blueRatio > 0.03 ? blueRatio * 2.0 : 0) + - (colorCount >= 3 ? 0.3 : 0) + - (colorVariance > 0.25 ? colorVariance * 1.0 : -0.3), + // Key insight from brain: melanoma has BOTH dark areas AND color diversity. + // A uniformly dark lesion is NOT melanoma — it needs multi-color + variance. + // Gate: at least 2 of [dark, blue, multicolor, high-variance] must be true + (() => { + const hasDark = darkRatio > 0.15; + const hasBlue = blueRatio > 0.03; + const hasMultiColor = colorCount >= 3; + const hasHighVariance = colorVariance > 0.25; + const evidenceCount = [hasDark, hasBlue, hasMultiColor, hasHighVariance] + .filter(Boolean).length; + // Need ≥2 concurrent melanoma features to overcome prior + if (evidenceCount < 2) return -0.5; + return (hasDark ? darkRatio * 1.2 : 0) + + (hasBlue ? blueRatio * 2.0 : 0) + + (hasMultiColor ? 0.3 : 0) + + (hasHighVariance ? colorVariance * 0.8 : 0); + })(), // nv: uniform brown, symmetric — brown dominant, low variance brownRatio * 1.2 + (1 - darkRatio) * 0.3 - colorVariance * 1.5 + 0.2, // vasc: red/purple dominant — high red, possibly blue