docs(bench): dark leaderboard styling for all benchmark charts
Leaderboard restyled to the LLM-benchmark look: dark background, rank-numbered labels, per-rank color palette, 'NN / 100 - grade' annotations. The live-run, task-matrix and performance charts share the same dark theme for a consistent README identity. Charts regenerated deterministically from their data files. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
af4813e7b6
commit
bae0750d4c
+36
-17
@@ -66,24 +66,43 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
|
||||
matplotlib.rcParams["svg.hashsalt"] = "autocad-mcp-source-review-v1"
|
||||
projects = sorted(data["projects"], key=lambda item: item["score"])
|
||||
labels = [item["repository"] for item in projects]
|
||||
total = len(projects)
|
||||
# rank 1 = highest score (drawn topmost by barh with ascending sort)
|
||||
labels = [
|
||||
f"{total - index}. {item['repository']}" for index, item in enumerate(projects)
|
||||
]
|
||||
scores = [item["score"] for item in projects]
|
||||
grades = [item["evidence_grade"] for item in projects]
|
||||
colors = ["#0969da" if label == "U-C4N/Autocad-MCP" else "#6e7781" for label in labels]
|
||||
# leaderboard palette by rank (rank 1 first), canvas/LLM-benchmark style
|
||||
rank_palette = [
|
||||
"#3fb950", # 1 green
|
||||
"#58a6ff", # 2 sky
|
||||
"#6e7ce0", # 3 indigo
|
||||
"#d29922", # 4 amber
|
||||
"#c4622d", # 5 rust
|
||||
"#e3b341", # 6 yellow
|
||||
"#bf4b8a", # 7 magenta
|
||||
"#f0876e", # 8 salmon
|
||||
"#8957e5", # 9 purple
|
||||
]
|
||||
colors = [
|
||||
rank_palette[(total - 1 - index) % len(rank_palette)]
|
||||
for index in range(total)
|
||||
]
|
||||
|
||||
fig, ax = plt.subplots(figsize=(12, 6.4), constrained_layout=True)
|
||||
fig.patch.set_facecolor("#f6f8fa")
|
||||
ax.set_facecolor("#f6f8fa")
|
||||
fig, ax = plt.subplots(figsize=(12, 0.62 * total + 2.4), constrained_layout=True)
|
||||
fig.patch.set_facecolor("#0d1117")
|
||||
ax.set_facecolor("#0d1117")
|
||||
bars = ax.barh(labels, scores, color=colors, height=0.62)
|
||||
|
||||
ax.set_xlim(0, 100)
|
||||
ax.set_xlabel("Weighted capability score / 100", color="#24292f", labelpad=10)
|
||||
ax.set_xlabel("Weighted capability score / 100", color="#e6edf3", labelpad=10)
|
||||
ax.set_title(
|
||||
"Source-reviewed capability benchmark",
|
||||
"Public AutoCAD MCP leaderboard — Source-reviewed capability benchmark",
|
||||
loc="left",
|
||||
fontsize=18,
|
||||
fontsize=17,
|
||||
fontweight="bold",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
pad=28,
|
||||
)
|
||||
ax.text(
|
||||
@@ -91,17 +110,17 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
1.02,
|
||||
f"Fixed rubric · reviewed {data['reviewed_at']} · evidence grade shown per project",
|
||||
transform=ax.transAxes,
|
||||
color="#57606a",
|
||||
color="#8b949e",
|
||||
fontsize=10,
|
||||
)
|
||||
|
||||
for bar, score, grade in zip(bars, scores, grades, strict=True):
|
||||
ax.text(
|
||||
min(score + 1.2, 96),
|
||||
min(score + 1.2, 88),
|
||||
bar.get_y() + bar.get_height() / 2,
|
||||
f"{score} · {grade}",
|
||||
f"{score} / 100 · {grade}",
|
||||
va="center",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
fontweight="bold",
|
||||
)
|
||||
|
||||
@@ -110,13 +129,13 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
-0.17,
|
||||
"Shared live-run results are not implied. Scores reflect public-source and recorded test evidence.",
|
||||
transform=ax.transAxes,
|
||||
color="#57606a",
|
||||
color="#8b949e",
|
||||
fontsize=9,
|
||||
)
|
||||
ax.grid(axis="x", color="#d0d7de", linewidth=0.8, alpha=0.8)
|
||||
ax.grid(axis="x", color="#30363d", linewidth=0.8, alpha=0.9)
|
||||
ax.set_axisbelow(True)
|
||||
ax.tick_params(axis="x", colors="#57606a")
|
||||
ax.tick_params(axis="y", colors="#24292f", length=0, pad=8)
|
||||
ax.tick_params(axis="x", colors="#8b949e")
|
||||
ax.tick_params(axis="y", colors="#e6edf3", length=0, pad=8)
|
||||
for spine in ax.spines.values():
|
||||
spine.set_visible(False)
|
||||
|
||||
|
||||
@@ -51,23 +51,23 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
coverage = [item["summary"]["coverage_percent"] for item in reports]
|
||||
passed = [item["summary"]["passed"] for item in reports]
|
||||
attempted = [item["summary"]["attempted"] for item in reports]
|
||||
colors = ["#0969da" if label == "autocad-mcp-pro" else "#6e7781" for label in labels]
|
||||
colors = ["#58a6ff" if label == "autocad-mcp-pro" else "#484f58" for label in labels]
|
||||
|
||||
fig, ax = plt.subplots(figsize=(12, 4.8), constrained_layout=True)
|
||||
fig.patch.set_facecolor("#f6f8fa")
|
||||
ax.set_facecolor("#f6f8fa")
|
||||
fig.patch.set_facecolor("#0d1117")
|
||||
ax.set_facecolor("#0d1117")
|
||||
bars = ax.barh(labels, scores, color=colors, height=0.58)
|
||||
|
||||
ax.set_xlim(0, 100)
|
||||
ax.set_xlabel(
|
||||
"Weighted live-run score / 100 (fixed 10-task matrix)", color="#24292f", labelpad=10
|
||||
"Weighted live-run score / 100 (fixed 10-task matrix)", color="#e6edf3", labelpad=10
|
||||
)
|
||||
ax.set_title(
|
||||
"Live-run benchmark - headless ezdxf lane",
|
||||
loc="left",
|
||||
fontsize=18,
|
||||
fontweight="bold",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
pad=28,
|
||||
)
|
||||
ax.text(
|
||||
@@ -75,7 +75,7 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
1.02,
|
||||
"Same 10 tasks, same harness, pinned competitor commits; artifacts verified by re-opening the DXF",
|
||||
transform=ax.transAxes,
|
||||
color="#57606a",
|
||||
color="#8b949e",
|
||||
fontsize=10,
|
||||
)
|
||||
|
||||
@@ -85,7 +85,7 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
bar.get_y() + bar.get_height() / 2,
|
||||
f"{score:g} ({ok}/{total} pass, {cov:g}% coverage)",
|
||||
va="center",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
fontweight="bold",
|
||||
)
|
||||
|
||||
@@ -94,13 +94,13 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
-0.22,
|
||||
"Unsupported tasks score 0 in the fixed matrix; per-task statuses and reasons are in benchmarks/results/published/.",
|
||||
transform=ax.transAxes,
|
||||
color="#57606a",
|
||||
color="#8b949e",
|
||||
fontsize=9,
|
||||
)
|
||||
ax.grid(axis="x", color="#d0d7de", linewidth=0.8, alpha=0.8)
|
||||
ax.grid(axis="x", color="#30363d", linewidth=0.8, alpha=0.8)
|
||||
ax.set_axisbelow(True)
|
||||
ax.tick_params(axis="x", colors="#57606a")
|
||||
ax.tick_params(axis="y", colors="#24292f", length=0, pad=8)
|
||||
ax.tick_params(axis="x", colors="#8b949e")
|
||||
ax.tick_params(axis="y", colors="#e6edf3", length=0, pad=8)
|
||||
for spine in ax.spines.values():
|
||||
spine.set_visible(False)
|
||||
|
||||
|
||||
@@ -20,12 +20,12 @@ DEFAULT_INPUT_DIR = ROOT / "benchmarks" / "results" / "published"
|
||||
DEFAULT_OUTPUT = ROOT / "docs" / "assets" / "autocad-mcp-taskmatrix.svg"
|
||||
|
||||
STATUS_COLORS = {
|
||||
"pass": "#2da44e",
|
||||
"partial": "#d4a72c",
|
||||
"fail": "#cf222e",
|
||||
"pass": "#238636",
|
||||
"partial": "#d29922",
|
||||
"fail": "#da3633",
|
||||
"timeout": "#a40e26",
|
||||
"unsupported": "#d0d7de",
|
||||
"not_run": "#f6f8fa",
|
||||
"unsupported": "#30363d",
|
||||
"not_run": "#161b22",
|
||||
}
|
||||
|
||||
STATUS_GLYPHS = {
|
||||
@@ -78,8 +78,8 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
figsize=(3.4 + 2.4 * len(servers), 1.8 + 0.52 * len(task_ids)),
|
||||
constrained_layout=True,
|
||||
)
|
||||
fig.patch.set_facecolor("#f6f8fa")
|
||||
ax.set_facecolor("#f6f8fa")
|
||||
fig.patch.set_facecolor("#0d1117")
|
||||
ax.set_facecolor("#0d1117")
|
||||
|
||||
for row, task_id in enumerate(task_ids):
|
||||
for col, server in enumerate(servers):
|
||||
@@ -91,11 +91,11 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
0.88,
|
||||
0.84,
|
||||
facecolor=color,
|
||||
edgecolor="#d0d7de",
|
||||
edgecolor="#30363d",
|
||||
linewidth=0.8,
|
||||
)
|
||||
)
|
||||
glyph_color = "#ffffff" if status in ("pass", "fail", "timeout") else "#24292f"
|
||||
glyph_color = "#ffffff" if status in ("pass", "fail", "timeout") else "#e6edf3"
|
||||
ax.text(
|
||||
col + 0.5,
|
||||
row + 0.5,
|
||||
@@ -110,10 +110,10 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
ax.set_xlim(0, len(servers))
|
||||
ax.set_ylim(len(task_ids), 0)
|
||||
ax.set_xticks([index + 0.5 for index in range(len(servers))])
|
||||
ax.set_xticklabels(servers, color="#24292f", fontsize=10, fontweight="bold")
|
||||
ax.set_xticklabels(servers, color="#e6edf3", fontsize=10, fontweight="bold")
|
||||
ax.xaxis.set_ticks_position("top")
|
||||
ax.set_yticks([index + 0.5 for index in range(len(task_ids))])
|
||||
ax.set_yticklabels(task_labels, color="#24292f", fontsize=9)
|
||||
ax.set_yticklabels(task_labels, color="#e6edf3", fontsize=9)
|
||||
ax.tick_params(length=0)
|
||||
for spine in ax.spines.values():
|
||||
spine.set_visible(False)
|
||||
@@ -123,7 +123,7 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
loc="left",
|
||||
fontsize=17,
|
||||
fontweight="bold",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
pad=34,
|
||||
)
|
||||
|
||||
@@ -140,6 +140,7 @@ def render_chart(reports: list[dict[str, Any]], output: Path) -> None:
|
||||
ncol=4,
|
||||
frameon=False,
|
||||
fontsize=9,
|
||||
labelcolor="#e6edf3",
|
||||
)
|
||||
|
||||
output.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
@@ -61,18 +61,18 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
values = [item["wall_ms"] for item in workloads]
|
||||
|
||||
fig, ax = plt.subplots(figsize=(12, 4.6), constrained_layout=True)
|
||||
fig.patch.set_facecolor("#f6f8fa")
|
||||
ax.set_facecolor("#f6f8fa")
|
||||
bars = ax.barh(labels, values, color="#0969da", height=0.58)
|
||||
fig.patch.set_facecolor("#0d1117")
|
||||
ax.set_facecolor("#0d1117")
|
||||
bars = ax.barh(labels, values, color="#58a6ff", height=0.58)
|
||||
|
||||
ax.set_xscale("log")
|
||||
ax.set_xlabel("Wall time in ms (log scale) — lower is better", color="#24292f", labelpad=10)
|
||||
ax.set_xlabel("Wall time in ms (log scale) — lower is better", color="#e6edf3", labelpad=10)
|
||||
ax.set_title(
|
||||
"Headless performance — ezdxf engine",
|
||||
loc="left",
|
||||
fontsize=18,
|
||||
fontweight="bold",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
pad=28,
|
||||
)
|
||||
env = data.get("environment", {})
|
||||
@@ -82,7 +82,7 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
f"Fixed workloads via the same backend methods the MCP tools call · "
|
||||
f"Python {env.get('python', '?')} · {env.get('platform', '?')}",
|
||||
transform=ax.transAxes,
|
||||
color="#57606a",
|
||||
color="#8b949e",
|
||||
fontsize=9,
|
||||
)
|
||||
|
||||
@@ -92,7 +92,7 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
bar.get_y() + bar.get_height() / 2,
|
||||
_annotation(item),
|
||||
va="center",
|
||||
color="#24292f",
|
||||
color="#e6edf3",
|
||||
fontweight="bold",
|
||||
fontsize=9,
|
||||
)
|
||||
@@ -104,13 +104,13 @@ def render_chart(data: dict[str, Any], output: Path) -> None:
|
||||
"Self-measurement only: competitor servers would pay extra stdio serialization cost in-process runs do not. "
|
||||
"Reproduce: python -m benchmarks.perf_suite",
|
||||
transform=ax.transAxes,
|
||||
color="#57606a",
|
||||
color="#8b949e",
|
||||
fontsize=9,
|
||||
)
|
||||
ax.grid(axis="x", color="#d0d7de", linewidth=0.8, alpha=0.8)
|
||||
ax.grid(axis="x", color="#30363d", linewidth=0.8, alpha=0.8)
|
||||
ax.set_axisbelow(True)
|
||||
ax.tick_params(axis="x", colors="#57606a")
|
||||
ax.tick_params(axis="y", colors="#24292f", length=0, pad=8)
|
||||
ax.tick_params(axis="x", colors="#8b949e")
|
||||
ax.tick_params(axis="y", colors="#e6edf3", length=0, pad=8)
|
||||
for spine in ax.spines.values():
|
||||
spine.set_visible(False)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user