diff --git a/packages/scraper/src/robots/flexoptix-detail-enricher.ts b/packages/scraper/src/robots/flexoptix-detail-enricher.ts index de934e0..c391594 100644 --- a/packages/scraper/src/robots/flexoptix-detail-enricher.ts +++ b/packages/scraper/src/robots/flexoptix-detail-enricher.ts @@ -227,8 +227,14 @@ function nominalSpeedFromSpecs(specs: FxApiSpec[]): number | null { if (/\bfast ethernet\b/.test(t)) sp = 0.1; else if (/\bgigabit ethernet\b/.test(t)) sp = 1; else { - const m = t.match(/\b(\d+(?:\.\d+)?)\s*g(?:b|be|ig)?\s*ethernet\b/) || t.match(/\b(\d+)\s*gbe\b/); - if (m) sp = parseFloat(m[1]); + // Terabit first ("1.6t ethernet" -> 1600), then Gigabit. Aggregate "Nx MMMg" + // twin-port labels resolve via the explicit total (e.g. "1.6T Ethernet"). + const mt = t.match(/\b(\d+(?:\.\d+)?)\s*t(?:b|be|ig)?\s*ethernet\b/); + if (mt) sp = parseFloat(mt[1]) * 1000; + else { + const m = t.match(/(?:^|[^x\d])(\d+(?:\.\d+)?)\s*g(?:b|be|ig)?\s*ethernet\b/) || t.match(/\b(\d+)\s*gbe\b/); + if (m) sp = parseFloat(m[1]); + } } if (sp !== null && (best === null || sp > best)) best = sp; }