diff --git a/src/pages/architecture.astro b/src/pages/architecture.astro index 168e4bea..075b70ac 100644 --- a/src/pages/architecture.astro +++ b/src/pages/architecture.astro @@ -60,6 +60,21 @@ const skillsByVerdict = Object.fromEntries( ); const shortContract = (c: string) => c.replace(/^contract:/, ""); +// Distinct backend vendors for a contract — one entry per vendor (not per +// implementing tool), with the tool(s) each backs kept for the tooltip. Without +// this, a vendor that ships several tools (e.g. GitHub) shows a duplicate badge +// per tool. Sorted to match the "N backend vendors: …" basis line. +const vendorsOf = (impls: { tool: string; vendor: string }[]) => { + const byVendor = new Map(); + for (const i of impls) { + if (!byVendor.has(i.vendor)) byVendor.set(i.vendor, []); + byVendor.get(i.vendor)!.push(i.tool); + } + return [...byVendor.entries()] + .map(([vendor, tools]) => ({ vendor, tools })) + .sort((a, b) => a.vendor.localeCompare(b.vendor)); +}; + // LLM-integration axis: group substrate tools by their agent-harness verdict. const HARNESS_VERDICT_META = [ { key: "agnostic", label: "Harness-agnostic", def: "runs under any agent harness", tone: "success" as const }, @@ -338,10 +353,10 @@ const inner = "mx-auto flex w-full max-w-[1100px] flex-col gap-5";
{CLASS_LABEL[c.class]} {c.implementations.length > 0 - ? c.implementations.map((impl) => ( - - - {impl.vendor} + ? vendorsOf(c.implementations).map((v) => ( + `tools/${t}`).join(", ")}`}> + + {v.vendor} )) : one spec, every backend}