Skip to content

sync: merge upstream/master into master / 同步上游 upstream/master 到 master - #20

Merged
aistackdev merged 269 commits into
masterfrom
sync/upstream-2026-08-28
Aug 28, 2026
Merged

aistackdev merged 269 commits into
masterfrom
sync/upstream-2026-08-28

Conversation

@aistackdev

Copy link
Copy Markdown

Summary

  • Merges 268 upstream commits (SemiAnalysisAI/InferenceX-app af1752a6..1d767224) into this fork's master.
  • All fork-only customizations preserved and verified against .claude/skills/fork-changelog/SKILL.md: rtx5090 in HW_REGISTRY, dsv2lite (DeepSeek-Coder-V2-Lite-Instruct) model registration, vngcloud/InferenceX in GITHUB_REPOS.
  • Resolved ~40 conflicting files across constants, DB/ETL, queries, and app lib. Deleted a handful of dead files upstream had refactored away (CollectiveXInventory.tsx, CollectiveXTables.tsx, etc.) after confirming zero remaining references.
  • Added MODEL_RELEASE_DATES entries required by new upstream exhaustiveness tests for the fork's two fork-only models; Gemma-4-31B's date is a placeholder (fork-only smoke-test model, no public release) flagged in-code for follow-up.

Verification

  • bun run typecheck, bun run lint, bun run fmt, bun run check:typography all pass.
  • bun run test:unit passes (~5100 tests across app/db/constants/mcp).
  • Per [[ci-blacksmith-broken]] this fork's hosted E2E/Unit checks never complete — not waited on; the above local runs are the actual verification.

中文说明

  • 将上游 268 个提交(SemiAnalysisAI/InferenceX-app af1752a6..1d767224)合并到本 fork 的 master。
  • 所有 fork 专属定制均已保留并对照 .claude/skills/fork-changelog/SKILL.md 核实:HW_REGISTRY 中的 rtx5090、dsv2lite(DeepSeek-Coder-V2-Lite-Instruct)模型注册、GITHUB_REPOS 中的 vngcloud/InferenceX。
  • 解决了约 40 个冲突文件(常量、DB/ETL、查询、应用层库)。确认无引用后删除了上游重构中已废弃的少量文件(CollectiveXInventory.tsx、CollectiveXTables.tsx 等)。
  • 为新增的上游穷举性测试所需,补充了两个 fork 专属模型的 MODEL_RELEASE_DATES 条目;Gemma-4-31B 的日期为占位值(fork 内部冒烟测试模型,无公开发布日期),已在代码注释中标注待跟进。

Test plan

  • bun run typecheck / lint / fmt / check:typography clean
  • bun run test:unit clean
  • Deploy to prod after merge, verify https://llmops-aiplatform.system.vngcloud.tech (basic auth llmops/llmops) responds and renders correctly

🤖 Generated with Claude Code

Oseltamivir and others added 30 commits July 29, 2026 07:35
Keep normal staging ingests cumulative and expose an explicit manual reset that restores the Neon branch from production. Re-staging remains idempotent for the selected workflow run.

中文:修复预发布流程,使常规写入累积保留已发布的基准测试运行;仅在显式手动重置时从生产环境恢复 Neon 分支。重复发布同一工作流运行仍保持幂等更新。
Restore the repository-wide bilingual contribution and website parity requirements.

中文:删除临时语言覆盖规则,恢复仓库范围内的双语贡献与网站同步要求。
…isAI#645)

* feat(overview): add scenario-aware comparisons

* fix(overview): address review feedback

* fix(overview): restore Chinese feature parity

Restore the Chinese landing CTAs, scenario-aware overview copy, and specific missing-result reasons after removing the temporary English-only override.

中文:恢复中文落地页入口、场景感知总览文案与具体缺失结果原因,确保删除临时仅英文覆盖规则后中英文功能保持一致。

* fix(overview): restore standard-decode fallback

Prefer speculative FP4/FP8 per platform, then fall back to labelled standard FP4/FP8 results. Select AgentX only when a model has no single-turn 8K/1K rows.\n\n中文:各平台优先选择推测解码 FP4/FP8;缺失时回退到明确标注的标准解码 FP4/FP8。仅当模型没有单轮 8K/1K 数据时选择 AgentX。
Preserve explicit non-disaggregated Dynamo deployments while retaining legacy inference for missing fields and decode-worker topology.

中文:尊重 Dynamo 产物中明确的非分离式部署标记,同时对缺失字段和存在解码工作进程池的旧产物保留兼容推断。
…Normalized E2E、会话时长与 Prefill TPS X 轴模式 (SemiAnalysisAI#644)

* feat(agentic): remove Normalized E2E / Session Time / Prefill TPS x-axis modes

Retire the three experimental agentic x-axis modes and everything that
existed solely to serve them, leaving Interactivity / E2E Latency / TTFT.

- chart: drop the three mode buttons, DERIVED_X_MODE_SPECS and the
  derived-metric fetch/remap plumbing in ChartDisplay; the remaining
  modes apply to both scenario kinds, so the agentic-only button filter
  (and its `mounted` SSR guard) goes too
- API/hook/db: delete /api/v1/derived-agentic-metrics, the
  useDerivedAgenticMetrics hook, and queries/derived-agentic-metrics.ts
- aggregate_stats v6: drop normalizedSessionTimeS, p90PrefillTpsPerUser
  and normalizedE2e400; mergeProfileStatsUpgrade no longer carries them
  forward, and the backfill's profile-only fast path now covers every
  v3+ bundle instead of only v3
- drop the NORMALIZED_E2E_OUTPUT_TOKENS constant and the overlay
  suppression helper that existed only for Normalized E2E

中文:移除三个实验性智能体 X 轴模式(Normalized E2E、会话时长、
Prefill TPS / user)及其专属实现,仅保留交互性 / 端到端延迟 / TTFT。
同时删除对应的 API 路由、React Query hook 与数据库查询模块;
aggregate_stats 升级至 v6,去掉三个已废弃字段,backfill 的
profile-only 快速路径扩展至所有 v3 及以上版本。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(e2e): make the Interactivity percentile assertion self-contained

The "switches back to Interactivity" test asserted a P75 axis label, but
nothing in it selected p75 — it inherited the selector state from the
Normalized E2E test that ran before it. Removing that test left the
selector on p90 and the assertion failed. Assert P90 there (the default)
and cover the p75 case in its own test that selects the percentile itself.

中文:「switches back to Interactivity」用例断言 P75 轴标签,但其自身
并未切换分位数,而是依赖此前 Normalized E2E 用例遗留的选择器状态。
该用例被移除后选择器停留在 p90,断言随之失败。现改为断言默认的 P90,
并将 p75 场景拆分为独立用例,由其自行切换分位数。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…miAnalysisAI#649)

Add GitHub workflow run 30405836523 to PURGED_RUNS so ingest skips it and
db:apply-overrides deletes its rows. The run is the ingest source run for
PR #2397 (kimik3-fp4-b300-vllm-agentic, 12 agentic points), an arm that
runs without speculative decoding; Kimi-K3 agentic coding is published
DSpark-only.

中文:将 GitHub workflow run 30405836523 加入 PURGED_RUNS,使 ingest 跳过
该 run,并由 db:apply-overrides 删除其数据库记录。该 run 是 PR #2397 的
ingest 源 run(kimik3-fp4-b300-vllm-agentic,12 个 agentic 数据点),
属于不启用投机解码的分支;Kimi-K3 智能体编码仅发布 DSpark 结果。

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…sAI#650)

Treat non-disaggregated multinode serving as its own deployment mode and normalize its single aggregate TP/PP/EP topology across ingestion, charts, tooltips, and agentic detail navigation.

中文:将非分离式多节点推理作为独立部署模式,并在数据摄取、图表、提示信息和 Agentic 详情导航中统一使用单一聚合 TP/PP/EP 拓扑。
中文:fix(overview):明确标注推测解码方法
…AI#652)

Adds a supporter quote from Rodrigo Liang (Co-Founder & CEO, SambaNova)
to the /quotes supporters page and the homepage quote carousel, with the
SambaNova logo (official wordmark, 160px WebP) and a LinkedIn link.

The entry is placed at the end of the carousel block in QUOTES so the
"carousel orgs are listed first" ordering invariant still holds, and
'SambaNova' is appended to CAROUSEL_ORGS. Includes the required
Simplified Chinese translation (textZh) for the /zh pages.

中文:新增 SambaNova 联合创始人兼 CEO Rodrigo Liang 的支持者引言,同时展示在
/quotes 支持者页面和首页引言轮播中,并配有 SambaNova 官方标识(160px WebP)
与 LinkedIn 链接。

- 该条目放在 QUOTES 数组中轮播区块的末尾,以保持"轮播机构排在前面"的排序约定,
  并将 'SambaNova' 追加到 CAROUSEL_ORGS。
- 按仓库双语要求补充了 textZh 简体中文译文,供 /zh 页面使用。
… / 更新 RTX PRO 6000 hyperscaler 与 neocloud 每 GPU 小时单价 (SemiAnalysisAI#651)

* chore(pricing): update RTX PRO 6000 hyperscaler and neocloud $/GPU/hr

Refresh the RTX PRO 6000 Blackwell Server Edition rental rates in
HW_REGISTRY from the SemiAnalysis AI Cloud TCO model:

- hyperscaler (costh): $0.43 -> $0.677 /GPU/hr
- neocloud (costn): $0.676 -> $0.746 /GPU/hr

These feed every cost-per-million-token metric (y_costh / y_costn) in
the inference chart, throughput calculator, per-dollar compare pages,
and the tco-feed API. The 3-year rental tier (costr) is unchanged.

中文:更新 RTX PRO 6000 Blackwell Server Edition 在 HW_REGISTRY 中的租用
单价(数据来自 SemiAnalysis AI Cloud TCO 模型):hyperscaler(costh)由
$0.43 调整为 $0.677 /GPU/hr,neocloud(costn)由 $0.676 调整为 $0.746
/GPU/hr。这两个值会影响推理图表、吞吐量计算器、每美元性能对比页面以及
tco-feed API 中所有的每百万 token 成本指标。3 年租赁层级(costr)保持不变。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test(overview): follow separated multi-node aggregate deployments

PR SemiAnalysisAI#650 made a non-disaggregated multi-node deployment its own serving
series, so the GB300 fixture's single-node (45 tok/s/user) and multi-node
aggregate (60 tok/s/user) points no longer blend into one curve and
DeepSeek-V4-Pro's GB300 cell has no read at @50. That PR updated
overview-data.test.ts but not overview.cy.ts, which still expected the
old interpolated ≈$1.19 estimate — six Overview specs have been failing
on master since it merged (they fail on any PR that touches
packages/app, including this one).

Point the estimate, evidence-date, cost-delta, mobile, and Chinese-sibling
assertions at cells that still carry a read (B200 ≈$0.89, GB200 +71%) and
assert the new GB300 outcome explicitly: a missing cell titled "no exact
@50 result" with no evidence date and no delta badge. Coverage of the
≈-estimate rendering, including the zh sr-only text, is preserved.

The GB200 badge saturates the alpha ramp at 0.40, which the browser
re-serializes as 0.4, so that assertion reads the computed background
color instead of the inline style attribute.

中文:PR SemiAnalysisAI#650 将非分离式多节点部署独立为单独的服务序列,因此 GB300 夹具中
的单节点点位(45 tok/s/用户)与多节点聚合点位(60 tok/s/用户)不再合并为
一条曲线,DeepSeek-V4-Pro 的 GB300 单元格在 @50 档位下没有结果。该 PR 更新
了 overview-data.test.ts,但未同步 overview.cy.ts,后者仍期望旧的插值估算值
≈$1.19——自其合并以来,master 上已有 6 个 Overview 用例持续失败(任何改动
packages/app 的 PR 都会触发,包括本 PR)。

现将估算值、证据日期、成本差异、移动端与中文页面的断言改为指向仍有结果的
单元格(B200 ≈$0.89、GB200 +71%),并显式断言 GB300 的新表现:标题为
「no exact @50 result」的缺失单元格,且没有证据日期与差异标签。≈ 估算值的
渲染覆盖(含中文 sr-only 文案)保持不变。GB200 的色阶徽章 alpha 值达到上限
0.40,浏览器会将其重新序列化为 0.4,因此该断言改为读取计算后的背景色而非
内联 style 属性。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…header cleanup / 总览成本口径改为超大规模云每百万总 token,并清理单元格状态与页头 (SemiAnalysisAI#653)

* fix(overview): price cost per 1M total tokens at hyperscaler rate

- cost = HW_REGISTRY.costh × 1e6 ÷ (total tok/s per deployed GPU × 3600); was costr over output tokens
- tier reads valued in tput_per_gpu (input + output) per deployed GPU; disagg keeps prefill+decode in the denominator; AgentX keeps the P90 interactivity tier axis
- cell states: — = no result; % vs B200; cost + neutral gray ∞ badge when the B200 baseline is missing
- cost value is now the evidence link into the filtered dashboard; visible dates and the DB-snapshot line removed, hover/focus/SR labels keep the run date
- header: metric line "Hyperscaler cost / 1M total tokens · ↓ lower is better" shares the title row on desktop, stacks on mobile/tablet
- drop datasetThroughDate/latestOverviewDate dead code; computeTierReads kernel made metric-neutral (external tco-feed contract unchanged); cost shows 3 decimals
- fixture rows carry per-config tput_per_gpu ratios so a regression to output-token pricing fails tests

中文:总览页成本口径从「零售 $/GPU/小时 ÷ 输出 tok/s」切换为「超大规模云 costh ÷ 每张已部署 GPU 的总 tok/s」;单元格三态改为 —(无结果)/ 相对 B200 百分比 / 成本 + 中性灰 ∞(缺少 B200 基线);成本数字本身成为进入对应筛选仪表板的证据链接,页面不再显示日期与数据库快照(hover/焦点/读屏标签保留复现信息);标题行信息层级重构并更新 methodology;删除 datasetThroughDate 等死代码;fixture 增加与输出不成比例的 tput_per_gpu,防止只改文案不改计算。

* fix(overview): align cost context and detail drilldowns

中文:优化成本指标的视觉层级,并让查看详情链接默认打开超大规模云每百万总 token 成本指标。

* fix(overview): remove approximate cost markers

中文:移除总览成本数值中的近似符号,同时保留插值来源说明和可访问性信息。

* fix(overview): align evidence links with cost semantics

中文:修正成本证据链接的指标与无障碍名称,并让可见日期测试忽略 Next.js 序列化脚本内容。
…d methodology, heat-map cells / 场景行按模型配置、新增 150/200 服务档位、精简方法说明、单元格热力图 (SemiAnalysisAI#654)

* feat(overview): trim methodology, add 150/200 tiers, split AgentX rows

Five changes to the Overview matrix:

- Methodology block keeps only the cell-state legend and the configuration
  note. The cost-formula, comparability, and interpolation paragraphs are
  removed.
- The configuration note now reads "If a chip does not have FP4 spec
  decoding available, the next best available configuration is used."
  instead of listing the priority chain.
- Service level gains 150 and 200 tok/s/user (30 / 50 / 75 / 100 / 150 /
  200). Both new tiers are real server-rendered URLs like the existing ones.
- A model benchmarked on both scenarios now gets one matrix row per
  scenario instead of a single row for whichever scenario won, so
  DeepSeek V4 Pro shows its single-turn 8K→1K row and an AgentX row. Each
  row is priced only from its own scenario's runs, and its detail and
  evidence links carry that scenario's workload. The AgentX scenario label
  is now "Long Context Multi-Turn Realistic Agentic Scenario (AgentX)".
- Cells no longer badge speculative decode, which is the expected case.
  Only a standard-decode read is called out, as STP.

Rows carry data-scenario so a model with two rows is addressable per row.
The e2e fixture gains two DeepSeek agentic-trace rows, deliberately at
throughputs that differ from its single-turn sweep so a regression feeding
single-turn data into the AgentX row would fail rather than coincide.

中文:总览页矩阵的五项改动:

- 方法说明区仅保留单元格状态图例与配置说明,删除成本公式、可比性与插值
  三段文字。
- 配置说明改为「If a chip does not have FP4 spec decoding available, the
  next best available configuration is used.」,不再罗列优先级链。
- 服务档位(Service level)新增 150 与 200 tok/s/用户(30 / 50 / 75 /
  100 / 150 / 200),两个新档位与既有档位一样是服务端渲染的真实 URL。
- 同时在两种场景下测试过的模型,现在按场景各占一行,而不再只保留优先级
  更高的那一个场景,因此 DeepSeek V4 Pro 会同时显示单轮 8K→1K 行与
  AgentX 行。每一行只使用本场景的运行数据计算成本,其详情与证据链接也指向
  该场景的工作负载。AgentX 场景标签改为「长上下文多轮真实智能体场景
  (AgentX)」。
- 单元格不再标注推测解码(默认即为推测解码),仅在使用标准解码时标注
  STP。

行元素新增 data-scenario 属性,便于逐行定位同一模型的两行。e2e 夹具新增
两条 DeepSeek 智能体轨迹(agentic traces)数据行,其吞吐量刻意与单轮数据
不同,从而在单轮数据被误用于 AgentX 行时能够触发测试失败。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(overview): curate scenario rows, shorten 8K/1K label, tint whole cells

- Scenario rows are now curated per model rather than derived from whichever
  scenarios happen to have rows: DeepSeek V4 Pro, MiniMax M3 and Qwen 3.5 get
  both a single-turn and an AgentX row; Kimi K3 and GLM-5.2 are AgentX only;
  Kimi K2.5/2.6/2.7-Code is single-turn only. A model absent from the map
  keeps the old data-derived single row, so a new model renders one row until
  it is curated.
- The single-turn scenario label is just "8K/1K" (was "Single-turn · 8K→1K").
- The comparison shade moves from the percentage badge to the whole cell, so
  the matrix reads as a heat map: the red/green alpha ramp is unchanged, and
  the two neutral states (±5% parity, and no B200 baseline) get a flat slate
  wash. Cells with no priced read stay untinted. The badge keeps its text
  color but no longer paints its own background, which would double the wash.

中文:

- 场景行改为按模型显式配置,不再依据「哪些场景恰好有数据」推导:DeepSeek
  V4 Pro、MiniMax M3 与 Qwen 3.5 同时显示单轮行与 AgentX 行;Kimi K3 与
  GLM-5.2 仅显示 AgentX;Kimi K2.5/2.6/2.7-Code 仅显示单轮。未在配置表中
  列出的模型沿用原先由数据推导的单行逻辑,因此新模型在完成配置前只渲染
  一行。
- 单轮场景标签简化为「8K/1K」(原为「单轮 · 8K→1K」)。
- 对比色阶由百分比徽章移至整个单元格,使矩阵整体呈现热力图效果:红/绿的
  alpha 渐变保持不变,两种中性状态(±5% 持平、缺少 B200 基线)采用统一的
  石板灰底色;没有计价结果的单元格不着色。徽章保留文字颜色,但不再绘制
  自身背景,以免同色叠加。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(overview): retitle, cite the TCO model, inline details, full rack labels

- The h1 is now "Inference Cost Blended Cost per Million Tokens".
- The metric line drops its unit: "Hyperscaler cost · ↓ Lower is better".
  The unit stays in the line's aria-label for screen readers.
- Under that line, right-aligned on desktop, the matrix cites the model its
  $/GPU/hr comes from: "Source: SemiAnalysis Market August 2025 AI Cloud TCO
  Model", linking to semianalysis.com/ai-cloud-tco-model.
- The Details column is gone; each row's "View details" link now sits in its
  Model · Scenario cell, and the freed width goes to the six data columns.
- Rack parts use their registry labels — GB200 NVL72 and GB300 NVL72, not
  GB200 and GB300 — so a rack SKU is never read as a board.

Page metadata titles are unchanged; only the on-page h1 moves.

中文:

- 页面主标题改为「推理混合每百万 token 成本」。
- 指标行去掉单位,显示为「超大规模云(hyperscaler)成本 · ↓ 越低越好」;
  单位保留在该行的 aria-label 中,供屏幕阅读器使用。
- 指标行下方(桌面端右对齐)新增数据来源标注:「来源:SemiAnalysis Market
  August 2025 AI Cloud TCO Model」,链接至 semianalysis.com/ai-cloud-tco-model,
  即矩阵中 $/GPU/hr 的取值来源。
- 删除独立的 Details 列,「查看详情」链接移入各行的「模型 · 场景」单元格,
  腾出的宽度分配给六个数据列。
- 整机柜产品使用注册表中的完整名称——GB200 NVL72 与 GB300 NVL72,而非
  GB200 与 GB300——避免把整机柜误读为单卡。

页面 metadata 标题保持不变,仅调整页面内的 h1。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(overview): fold provenance into the metric line, stick the matrix header

- The standing blurb ("Every active model across MI355X, B200, B300, GB200
  and GB300 at a glance.") is removed.
- The metric line now carries provenance: "Hyperscaler cost · ↓ Lower is
  better · Source: InferenceX & SemiAnalysis Market August 2025 AI Cloud TCO
  Model", where only the model name is the link, followed by the shared
  external-link glyph. The former standalone source line is gone.
- The desktop matrix header row is sticky, pinned at top-14 so it clears the
  site header (h-14, sticky top-0, z-50) and never slides under it. The
  header cells are opaque, and neither the card nor the table wrapper clips
  on xl any more — an overflow container would have captured the sticky
  header instead of letting it pin to the page.

中文:

- 删除固定说明文字「一眼对比各活跃模型在 MI355X、B200、B300、GB200 与
  GB300 上的表现。」
- 指标行合并数据来源,显示为「超大规模云(hyperscaler)成本 · ↓ 越低越好 ·
  来源:InferenceX 与 SemiAnalysis Market August 2025 AI Cloud TCO Model」,
  其中仅模型名称为超链接,并附带项目通用的外链图标;原先独立的来源行已移除。
- 桌面端矩阵表头改为吸顶,偏移量为 top-14,正好避开站点头部(h-14、sticky
  top-0、z-50),不会被其遮挡。表头单元格使用不透明背景;同时在 xl 断点下
  取消卡片与表格容器的裁剪,否则滚动容器会「捕获」吸顶元素,使其无法相对
  页面吸顶。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(overview): retitle to "Inference Cost per Million Tokens"

Drops the redundant "Blended Cost" from the on-page h1. Metadata titles are
unchanged.

中文:页面主标题改为「推理每百万 token 成本」,去掉重复的「混合」表述;
metadata 标题保持不变。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(overview): keep the B200 column unwashed, name detail links by scenario

Two findings from Cursor Bugbot on the heat-map change:

- costDeltaCellStyle read B200's null costVsB200Pct as the ∞ / no-baseline
  state, so every priced B200 cell took the slate wash and covered the
  reference column's bg-muted/30. On the baseline a null delta means "nothing
  to compare against itself" — return no tint there.
- With two scenario rows per model, both "View details" links carried the
  same accessible name while pointing at different workloads (i_seq=8k/1k vs
  i_seq=agentic-traces). detailAria now takes the scenario label too, so the
  links read "View details: DeepSeek V4 Pro 1.6T · 8K/1K" and "… · Long
  Context Multi-Turn Realistic Agentic Scenario (AgentX)".

Both are covered by new assertions in overview.cy.ts.

中文:修复 Cursor Bugbot 在热力图改动中发现的两个问题:

- costDeltaCellStyle 把 B200 的 costVsB200Pct 为 null 误判为 ∞(缺少基线)
  状态,导致所有已计价的 B200 单元格都被涂上石板灰底色,覆盖了参考列原有的
  bg-muted/30 样式。对基线列而言,null 表示「无需与自身比较」,因此不应着色。
- 单个模型有两行场景时,两个「查看详情」链接的无障碍名称完全相同,但指向
  不同的工作负载(i_seq=8k/1k 与 i_seq=agentic-traces)。detailAria 现在
  额外接收场景标签,链接读作「查看详情:DeepSeek V4 Pro 1.6T · 8K/1K」与
  「…· 长上下文多轮真实智能体场景(AgentX)」。

两项修复均已在 overview.cy.ts 中补充断言覆盖。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style(overview): stack the metric line under the title at every width

The header was two columns from xl up — title left, metric right. It is now
two rows everywhere: "Inference Cost per Million Tokens", then "Hyperscaler
cost · ↓ Lower is better · Source: InferenceX & SemiAnalysis Market August
2025 AI Cloud TCO Model" beneath it.

中文:页头此前在 xl 及以上断点为左右两栏(左侧标题、右侧指标)。现改为在所有
宽度下均为上下两行:第一行「推理每百万 token 成本」,第二行「超大规模云
(hyperscaler)成本 · ↓ 越低越好 · 来源:InferenceX 与 SemiAnalysis Market
August 2025 AI Cloud TCO Model」。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…aders / 档位控件标签改为 SLO 并放大列表头字号 (SemiAnalysisAI#657)

* chore(overview): label the tier control SLO

Renames the service-tier selector from "Service level" to "SLO" — the term
the rest of the industry uses for the interactivity target these tiers set.
The nav's aria-label follows the visible text. Tier values, links and
behavior are unchanged.

The Chinese page uses "SLO" as well: it is the standard acronym in Chinese
serving-infrastructure writing, and a translated phrase ("服务等级目标") would
be three times as wide in a control that already has to fit six tiers on a
320px phone.

中文:将服务档位选择器的标签由「Service level」改为「SLO」——这是业界对这些
档位所设定的交互性目标的通用称呼;导航的 aria-label 与可见文本保持一致。档位
数值、链接与行为均未改变。

中文页面同样使用「SLO」:该缩写在中文服务基础设施相关文档中已是标准写法,而
完整译名「服务等级目标」宽度约为其三倍,该控件在 320px 手机上还需容纳六个
档位,无法承受。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style(overview): raise the matrix column headers to 14px

The platform header row (Model · Scenario, B200 · Reference, MI355X, B300,
GB200 NVL72, GB300 NVL72) was 12px — the same size as the per-cell
configuration metadata it labels. At 14px it reads as a header again. The
matrix still fits without clipping at 1280 and 1440.

中文:矩阵列表头(Model · Scenario、B200 · Reference、MI355X、B300、
GB200 NVL72、GB300 NVL72)此前为 12px,与其所标注的单元格配置信息同号;现
调整为 14px,恢复表头的层级感。矩阵在 1280 与 1440 宽度下仍不会裁剪。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: explain clipped inference chart lines

Add dashed Pareto continuations and boundary arrows for cost and TTFT limits.
Show bilingual clipped-point details for official and unofficial-run series.
Cover official, overlay, and dismissal behavior with unit and Cypress tests.

中文:为成本与 TTFT 显示上限增加 Pareto 曲线虚线延伸和边界箭头,并为正式数据与 unofficial run 提供双语截断说明及测试。

* fix: keep overflow arrows compact

Preserve the existing chart domain and cap clipped Pareto continuations at 96 pixels.
Move clipped-point counts from the corner popover onto each series arrow.
Count all hidden points covered by the displayed cost or TTFT limit.

中文:保留现有图表坐标范围,将截断的 Pareto 延伸线限制为 96 像素,并把隐藏点数量和成本或 TTFT 上限直接标注在各曲线箭头旁。

* fix: interpolate and layer overflow continuations

中文:使用样条插值绘制图表越界延长线,将虚线置于主曲线后方,并保持缩放、标签位置与主题描边正确。

* fix: constrain overflow splines in ttft

中文:限制 TTFT 图表越界样条的可见长度,避免预测线横跨整张图表,并保持标签位于图表边界内。

* fix: clarify overflow cost label unit

中文:将越界成本标签单位从 /M 明确为 /Mtok,并同步中英文界面及回归测试。

* fix: correct overflow counts and labels

中文:按箭头方向统计越界点,并确保底部箭头的标签保持在箭头下方。

---------

Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>
中文:当箭头接近图表底部时,将越界标签移到箭头上方,避免标签被图表裁剪边界截断。
…isAI#661)

SemiAnalysisAI#659 imported the July model's raw outputs, so nine GPUs carried 16-digit
rates (b200 costh 1.7349236084834354). HW_REGISTRY holds published $/GPU/hr,
not model residue: every costh/costn is now rounded to two decimals, matching
the costr tier and every rate the registry carried before.

Two rendered values move with the rates, both from crossing a rounding
boundary rather than from any logic change:

- Qwen 3.5 MI355X @50 reads -14% vs B200 (was -15%): mi355x costh 1.4961 →
  1.50 and b200 1.7349 → 1.73 shift the ratio ~0.55%, across the 14.5% line.
- Qwen 3.5 MI355X @100 costs $0.075/1M tok (was $0.074).

constants.test.ts gains a guard that every cost tier equals its own two
decimal rounding, so a future import cannot reintroduce raw floats.

中文:SemiAnalysisAI#659 直接引入了 7 月模型的原始输出,导致九款 GPU 的费率带有 16 位小数
(如 b200 costh 为 1.7349236084834354)。HW_REGISTRY 存放的是对外发布的
$/GPU/hr,而非模型中间结果:现将所有 costh/costn 四舍五入至两位小数,与 costr
层级以及此前注册表中的所有费率保持一致。

有两个渲染值随费率变动,均因跨越四舍五入边界,而非逻辑改动:Qwen 3.5 MI355X
在 @50 档位显示为 -14%(原 -15%)——mi355x costh 由 1.4961 变为 1.50、b200 由
1.7349 变为 1.73,比值偏移约 0.55%,恰好越过 14.5% 分界;Qwen 3.5 MI355X 在
@100 档位为 $0.075/百万 token(原 $0.074)。

constants.test.ts 新增断言:每个成本层级都必须等于其自身的两位小数取整值,
避免今后再次引入原始浮点数。

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…行 30346826643 (SemiAnalysisAI#662)

* chore(db): purge MiniMax M3 AMD run 30346826643

Record the initial AMD MiniMax M3 submission in PURGED_RUNS because it used the incorrect AgentX harness. Results will be updated after the harness changes.

中文:将初始 AMD MiniMax M3 提交运行 30346826643 加入清理列表,因为该运行使用了错误的 AgentX 测试工具。待测试工具更新后将重新提交结果。

* docs(db): clarify purge rationale for run 30346826643

Record that MTP/speculative decoding is supported only for AgentX in addition to the incorrect harness rationale.

中文:补充清理运行 30346826643 的原因,除使用错误测试工具外,MTP/推测解码也仅适用于 AgentX。
…#663)

* feat(nav): promote overview and simplify header

Move Overview into the top-level navigation, relocate Supporters, Datasets, and Articles to the localized footer, and document local versus sharded E2E timing guidance.\n\n中文:将“总览”提升至顶层导航,把“支持者”“数据集”和“文章”移至本地化页脚,并补充本地与分片 E2E 测试耗时说明。

* fix(nav): make overview transitions resilient

Route desktop and mobile Overview clicks through the existing in-app navigation workaround and align the overview mobile test with the intentionally hidden dashboard selector.\n\n中文:让桌面端和移动端的“总览”点击复用现有的应用内导航兼容逻辑,并让总览移动端测试匹配已按设计隐藏的仪表板选择器。
)

* feat: add audited benchmark point purges

中文:新增可审计的基准测试点删除机制

* fix: preserve point purges without attempts

中文:在未知运行尝试次数时保留基准测试点删除规则

* docs: document audited benchmark point purges

中文:补充可审计基准测试点删除机制文档
…miAnalysisAI#666)

* feat(blog): port Kimi K3 architecture article from Substack

Ports "Kimi K3: The Manos, The Mythos, The Legendos" (SemiAnalysis
newsletter, 2026-08-03) to /blog and /zh/blog: the free portion of the
article, all 25 figures, and the FAQ JSON-LD block.

The post is equation-heavy, so this also adds LaTeX support to the MDX
pipeline (remark-math + rehype-katex) on both the English and Chinese
post pages. `singleDollarTextMath` is disabled because posts are full of
prices like $1.95/GPU/hr that a single-dollar delimiter would swallow;
math uses `$$`. KaTeX runs with `strict: false` so one bad expression
cannot fail the build, and its CSS/fonts are self-hosted.

`<Figure caption>` is a plain string prop that MDX never parses, so
markdown links in source credits rendered as literal brackets. Added
`renderCaption` to turn `[label](https://…)` into real anchors.

Tests: unit coverage for `renderCaption`, a content-integrity suite over
every post (zh sibling exists, frontmatter parity, referenced images
exist, balanced `$$`), and e2e checks that KaTeX renders and that
dollar-prefixed prices stay literal in both locales.

中文:移植 SemiAnalysis 通讯 2026-08-03 的《Kimi K3:那个人、那个神话、那个传奇》
架构文章至 /blog 与 /zh/blog,包含免费部分正文、全部 25 张配图与 FAQ JSON-LD。
由于文章公式密集,同时为 MDX 流程加入 LaTeX 支持(remark-math + rehype-katex),
并禁用单 $ 行内公式以免吞掉 $1.95/GPU/hr 之类价格;KaTeX 以 strict: false 运行,
CSS 与字体本地自托管。另修复 <Figure caption> 中 markdown 链接渲染为字面括号的问题。
新增 renderCaption 单元测试、覆盖全部文章的内容完整性测试,以及两种语言下的 e2e 校验。

* fix(blog): use idiomatic Chinese for the Kimi K3 title

"The man, the myth, the legend" reads as a set phrase; the literal
"那个人、那个神话、那个传奇" does not. "其人、其神话、其传奇" keeps
the triad and the tone.

中文:将 Kimi K3 中文标题改为"其人、其神话、其传奇",比逐字直译的
"那个人、那个神话、那个传奇"更符合中文表达习惯,也保留了原文的三段式与语气。

* fix(blog): match KaTeX CSS to renderer, cite K3 in glossary, fix lazy-image assert

Three CI/review failures on the Kimi K3 port:

- KaTeX version mismatch (Cursor Bugbot, high severity, confirmed):
  rehype-katex@7 renders HTML with its nested katex@0.16, but the direct
  katex@^0.18.1 dependency supplied the imported stylesheet. 0.18 renamed
  `.base`/`.strut` to `.katex-base`/`.katex-strut`, so the shipped CSS
  matched nothing the renderer emitted and math rendered unstyled. Pinned
  katex to ^0.16.47 so both come from one deduped copy, and added
  katex-css-version.test.ts to fail on any future drift.
- glossary.test.ts requires every post to be cited by a glossary entry.
  Cited the K3 article from the eight entries it actually covers:
  kv-cache, prefix-caching, speculative-decoding, expert-parallelism,
  mixture-of-experts, multi-head-latent-attention, sparse-attention, vllm.
- The e2e figure check asserted naturalWidth > 0 on all 25 images, but
  only the first is eager — the rest are lazy and never load in a
  viewport-height run. Decode is now asserted on the eager image only,
  with a separate check that every figure src returns 200.

中文:修复 Kimi K3 移植 PR 的三处 CI/评审问题。
一、KaTeX 版本不匹配(Cursor Bugbot 高危,已本地复现):rehype-katex@7 使用其内嵌的
katex@0.16 生成 HTML,而直接依赖 katex@^0.18.1 提供样式表;0.18 将 `.base`/`.strut`
重命名为 `.katex-base`/`.katex-strut`,导致所发布的 CSS 与渲染出的类名完全不匹配,公式
失去样式。现将 katex 固定到 ^0.16.47,使两者去重为同一份,并新增 katex-css-version.test.ts
防止后续再次漂移。
二、glossary.test.ts 要求每篇文章都被术语表条目引用,已在文章真正涉及的八个条目中引用。
三、e2e 此前对全部 25 张图断言 naturalWidth > 0,但只有首图是 eager,其余为 lazy 且在
单屏高度下不会加载;现仅对首图断言解码,另增一项校验所有图片 src 均返回 200。

* fix(test): resolve the blog content dir with import.meta.dirname

`new URL(import.meta.url).pathname` keeps percent-encoding and yields a
leading-slash `/C:/…` on Windows, so readdirSync/existsSync would hit
invalid paths and the suite would fail before asserting anything. It is
also wrong on POSIX when the checkout path contains spaces.

中文:`new URL(import.meta.url).pathname` 会保留百分号编码,且在 Windows 上返回
形如 `/C:/…` 的路径,导致 readdirSync/existsSync 解析到无效路径、测试尚未断言即失败;
在 POSIX 上若仓库路径含空格同样有问题。改用 `import.meta.dirname`。
中文:CI:Agentic ingest 改用 8 vCPU runner,以提供足够的产物解压空间。
…站用户可见文案中的 "GPU" 重命名为 "Chip" (SemiAnalysisAI#668)

* refactor(ui): rename user-facing "GPU" to "Chip" across the site

Renames the accelerator term in every user-visible surface — tab labels,
chart axis/legend/tooltip text, table headers, control labels, glossary,
FAQ, compare narrative templates, page titles and meta descriptions — on
both the English and /zh sides.

Casing follows context: "Chip" in labels and Title Case headings, "chip"
in sentence prose, and lowercase in units (tok/s/chip, $/chip/hr) to match
the existing tok/s/user convention. The /zh pages keep the term in English
as "Chip", the way "GPU" was kept before.

Deliberately unchanged: published blog posts, attributed third-party
quotes, SEO keyword arrays, code identifiers, DB/metric keys, URL routes
(/gpu-specs, /gpu-metrics), analytics event names, API field names, and
the AI-chart LLM system prompt.

中文:将全站用户可见文案中的 "GPU" 统一改为 "Chip",覆盖标签页名称、图表坐标轴/
图例/工具提示、表头、控件标签、术语表、FAQ、对比页叙述模板以及页面标题与元描述,
英文站与 /zh 中文站同步更新。大小写按语境处理:标签与标题用 "Chip",句中散文用
"chip",单位保持小写(tok/s/chip、$/chip/hr)以匹配既有的 tok/s/user 约定;
中文页面沿用英文术语 "Chip",与此前保留 "GPU" 的做法一致。

刻意未改动:已发布的博客文章、第三方署名引言、SEO 关键词数组、代码标识符、
数据库与指标键名、URL 路由(/gpu-specs、/gpu-metrics)、分析事件名、API 字段名,
以及 AI Chart 的 LLM 系统提示词。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(test): update stale GPU assertions in Cypress specs

Bugbot caught Cypress assertions still expecting the pre-rename copy:
the TCO badge (`TCO $/GPU/hr`), Chip Specs headings and topology node
labels, Custom Chip Costs/Powers titles, the fleet-planner too-small
message, and the disagg caveat text.

中文:修复 Cypress 测试中残留的重命名前文案断言,包括 TCO 徽标
(`TCO $/GPU/hr`)、Chip 规格页标题与拓扑图节点标签、Custom Chip
Costs/Powers 标题、集群规划器功率不足提示,以及分离式部署提示文案。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(test): update stale GPU assertions in Cypress component specs

The earlier sweep only covered cypress/**/*.ts and missed the .tsx
component specs. inference-chart-controls asserted the old 'GPU Config'
label and 'Output Token Throughput per GPU' option — the two failures in
the Component tests job. Also relabels the self-supplied yLabel props in
scatter-graph/gpu-graph and the multi-select placeholder so the fixtures
match the renamed UI.

中文:此前的排查只覆盖 cypress 目录下的 .ts 文件,遗漏了 .tsx 组件测试。
inference-chart-controls 仍断言重命名前的 'GPU Config' 标签和
'Output Token Throughput per GPU' 选项,即 Component tests 任务的两处失败。
同时将 scatter-graph/gpu-graph 中自定义的 yLabel 属性与 multi-select
占位符改为与重命名后的界面一致。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
中文:CI:Agentic ingest 改用 16 vCPU runner,以容纳嵌套产物解压后的完整磁盘占用。
…alysisAI#673)

* perf(db): streamline trace metric parsing

Replace the dual token fan-out with one packed-token consumer that only assembles selected metric values. Add regression coverage for nested lookalikes, scalar and compound values, duplicate keys, malformed input, and both metric phases.\n\n中文:优化 trace 指标解析。用单一 packed-token 消费器替代双路 token 分发,仅组装需要的指标值;补充嵌套同名字段、标量与复合值、重复键、异常输入及两个指标阶段的回归测试。

* perf(db): parallelize trace replay preparation

Split CPU-heavy trace preparation from atomic persistence, run it in a vCPU-scaled bounded worker pool, cap concurrent uploads, and recheck links under row locks. Add worker transfer, queue-bound, failure-recovery, and concurrent-ingest regression coverage.\n\n中文:并行化 trace replay 预处理。将 CPU 密集型预处理与原子化持久化拆分,使用按 vCPU 数量伸缩的有界 worker 池执行,限制并发上传,并在行锁内重新检查关联状态;补充 worker 数据传输、队列内存上限、失败恢复及并发摄取回归测试。
… / 新增端到端归一化交互性 X 轴指标并设为智能体默认 (SemiAnalysisAI#638)

* feat(agentic): remove Normalized E2E / Session Time / Prefill TPS x-axis modes

Retire the three experimental agentic x-axis modes and everything that
existed solely to serve them, leaving Interactivity / E2E Latency / TTFT.

- chart: drop the three mode buttons, DERIVED_X_MODE_SPECS and the
  derived-metric fetch/remap plumbing in ChartDisplay; the remaining
  modes apply to both scenario kinds, so the agentic-only button filter
  (and its `mounted` SSR guard) goes too
- API/hook/db: delete /api/v1/derived-agentic-metrics, the
  useDerivedAgenticMetrics hook, and queries/derived-agentic-metrics.ts
- aggregate_stats v6: drop normalizedSessionTimeS, p90PrefillTpsPerUser
  and normalizedE2e400; mergeProfileStatsUpgrade no longer carries them
  forward, and the backfill's profile-only fast path now covers every
  v3+ bundle instead of only v3
- drop the NORMALIZED_E2E_OUTPUT_TOKENS constant and the overlay
  suppression helper that existed only for Normalized E2E

中文:移除三个实验性智能体 X 轴模式(Normalized E2E、会话时长、
Prefill TPS / user)及其专属实现,仅保留交互性 / 端到端延迟 / TTFT。
同时删除对应的 API 路由、React Query hook 与数据库查询模块;
aggregate_stats 升级至 v6,去掉三个已废弃字段,backfill 的
profile-only 快速路径扩展至所有 v3 及以上版本。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(agentic): add OSL / E2EL x-axis metric as the agentic default

Introduces "OSL / E2EL" ("e2e interactivity") for agentic scenarios: the
per-request output-token rate INCLUDING the prefill wait,
OSL / (TTFT + generation time) ≈ 1 / (ITL + TTFT/OSL). Unlike plain
interactivity it cannot be inflated by delaying prefill.

- aggregate_stats v7: store `e2elPerOsl`, percentiles of the per-request
  E2EL/OSL ratio (seconds per output token). The read path inverts, so
  pXX OSL/E2EL = 1 / pXX(E2EL/OSL) — the slow-tail convention the ETL
  already enforces for `*_intvty`
- API: /api/v1/derived-agentic-metrics returns p75/p90_osl_per_e2el
- chart: new mode, agentic default, listed first; fixed-seq is unchanged
  and never shows the button
- overlays: suppressed in this mode (unofficial rows carry no persisted
  per-request trace) with a caption disclaimer
- shared cypress helper interceptDerivedAgenticMetrics stubs the fetch
  the default mode fires on mount; overlay specs switch to Interactivity
  explicitly before asserting overlay points

中文:为智能体场景新增 "OSL / E2EL"(e2e interactivity)指标:每请求
输出 token 速率(含 prefill 等待),即 OSL /(TTFT + 生成时间)。
aggregate_stats 升级至 v7,存储每请求 E2EL/OSL 比值的分位数,读取时取
倒数以沿用 `*_intvty` 的慢尾约定;新增 API 字段与图表模式,并设为智能体
默认模式且置于最左侧;该模式下隐藏非官方运行覆盖层并显示提示文案。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(e2e): make the Interactivity percentile assertion self-contained

The "switches back to Interactivity" test asserted a P75 axis label, but
nothing in it selected p75 — it inherited the selector state from the
Normalized E2E test that ran before it. Removing that test left the
selector on p90 and the assertion failed. Assert P90 there (the default)
and cover the p75 case in its own test that selects the percentile itself.

中文:「switches back to Interactivity」用例断言 P75 轴标签,但其自身
并未切换分位数,而是依赖此前 Normalized E2E 用例遗留的选择器状态。
该用例被移除后选择器停留在 p90,断言随之失败。现改为断言默认的 P90,
并将 p75 场景拆分为独立用例,由其自行切换分位数。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(e2e): restore the p90 percentile after the OSL / E2EL p75 assertion

The percentile selector is page state shared across the whole suite, so
leaving it on p75 made the following Interactivity test's P90 assertion
depend on test order. Restore the default at the end of the test that
changes it.

中文:分位数选择器是整个套件共享的页面状态,停留在 p75 会使后续
Interactivity 用例的 P90 断言依赖执行顺序。现在由改动它的用例在结束时
恢复默认值。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(inference): stop the x-axis reconcile from clobbering a URL-restored mode

The reconcile effect ran before availability resolved the sequence. On a
cold load it recorded the fixed-seq placeholder kind, then treated the
switch to agentic as a user-driven kind change and snapped to the agentic
default — so /inference?i_seq=agentic-traces&i_xmode=interactivity landed
on OSL / E2EL instead. Gate the effect on `sequenceResolved`, matching the
label effect above it, so the first run sees the real kind and the
URL-restored mode survives.

Found by Cursor Bugbot; reproduced against the live DB before and after.
Pre-existing on master (it clobbered a URL-restored TTFT/E2E with
interactivity there) — visible now because the agentic default differs.

中文:X 轴模式协调 effect 在 availability 解析出场景之前就已运行:冷启动
时它记录了固定序列占位场景,随后把切换到智能体场景误判为用户主动切换,
从而覆盖 URL 中的 `i_xmode`。现与其上方的 label effect 一致,改为在
`sequenceResolved` 之后才执行。该问题在 master 上已存在,因智能体默认模式
变更后才变得可见。新增回归用例(去掉修复即失败)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(inference): keep the y-metric's roofline direction on the OSL / E2EL chart

The mode hardcoded `upper_left` for every y-metric. That is right for
throughput but inverts the frontier for cost and joules metrics, whose good
direction is a LOWER corner — and Optimal Only filters off the same flag, so
the wrong points were hidden on what is now the agentic default view.

Derived modes render on the e2e chart definition (lower-x-is-better) while
OSL / E2EL is higher-is-better, so the correct transform is a horizontal
mirror of each configured corner, not a constant: upper_right → upper_left
for throughput, lower_left → lower_right for cost/joules. Extracted as
`derivedModeRoofline` and unit-tested against the real chart config — the
mirrored e2e corner must equal the interactivity chart's corner for every
y-metric, since both axes are higher-is-better.

Found by Cursor Bugbot. Confirmed the tests fail with the hardcoded corner
restored and pass with the mirror.

中文:该模式此前对所有 Y 轴指标硬编码 `upper_left`,对吞吐量正确,但会让
成本与能耗类指标的帕累托前沿方向反转(Optimal Only 也依赖同一标记,
导致隐藏了错误的点)。派生模式渲染在 e2e 图表定义之上(x 越小越好),
而 OSL / E2EL 是越大越好,因此正确做法是对配置中的角位做水平镜像而非
固定取值。已抽出 `derivedModeRoofline` 并针对真实图表配置编写单元测试。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(db): don't stamp an incomplete aggregate_stats bundle on self-heal

The derived-metrics read path only sees the profile blob, so it cannot
recompute kvCacheUtil / prefixCacheHitRate — it carries them forward from
the stale row. When the stale row had none (null stats, or a pre-v3
bundle), it still wrote nulls stamped at the current STATS_VERSION. That
looks complete to everyone downstream: the backfill's candidate query
matches on version and skips the row, and agentic-aggregates takes the
fast path, so those server-derived fields stay null permanently. It also
broke writeBackTraceReplayJsonb's documented contract that callers only
persist COMPLETE payloads.

Self-heal now only stamps the bundle when there are server-derived fields
to preserve. Otherwise the row stays stale, costing one repeat profile
parse and letting a reader that CAN see the server blob heal it fully.

Pre-existing behavior carried over from before the metric split; found by
Cursor Bugbot. Test asserts no UPDATE is issued for a null-stats row and
fails if the guard is removed.

中文:派生指标读取路径只能看到 profile blob,无法重算
kvCacheUtil / prefixCacheHitRate,只能从旧行继承。当旧行没有这些字段时,
此前仍会写入 null 并打上当前 STATS_VERSION,使 backfill 跳过该行、
agentic-aggregates 走快速路径,导致这些字段永久为空。现仅在确实有服务端
字段可保留时才写回,否则保持 stale,交由能读取 server blob 的读取方修复。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(agentic): rename OSL / E2EL to E2E Normalized Interactivity

Renames the agentic x-axis metric everywhere it surfaces: the mode
button, the chart heading, the x-axis label (still tok/s/user), the
overlay-suppression disclaimer, the `i_xmode` value, data-testids, the
`XAxisMode` literal, and the API/query fields (`p75/p90_osl_per_e2el` →
`p75/p90_e2e_norm_intvty`, matching the existing `*_intvty` convention).

Adds the Chinese labels the old name skipped: mode button, x-axis label,
chart heading, and disclaimer now read 端到端归一化交互性 rather than
falling back to English.

The stored `e2elPerOsl` / `e2el_per_osl` bundle keys are deliberately
unchanged — they name the raw persisted quantity (E2E latency per output
token, s/tok), which is the reciprocal of the metric; the read path still
inverts it.

中文:将智能体 X 轴指标 OSL / E2EL 全面重命名为 E2E Normalized
Interactivity,涵盖模式按钮、图表标题、X 轴标签(单位仍为 tok/s/user)、
覆盖层提示文案、`i_xmode` 取值、data-testid、`XAxisMode` 字面量,以及
API 与查询字段(`p75/p90_osl_per_e2el` → `p75/p90_e2e_norm_intvty`,
与既有 `*_intvty` 命名约定一致)。

同时补齐此前缺失的中文文案:模式按钮、X 轴标签、图表标题与提示文案
现均显示"端到端归一化交互性",不再回退英文。

存储层的 `e2elPerOsl` / `e2el_per_osl` 键名刻意保持不变:它们描述的是
持久化的原始量(每输出 token 的端到端延迟,单位 s/tok),即该指标的倒数,
读取路径仍会取倒数。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(test): switch the CSV overlay spec off the agentic default mode

csv-export-overlay visits an agentic scenario, so it now lands on E2E
Normalized Interactivity, where unofficial-run overlays are suppressed —
the `.unofficial-overlay-pt` assertion in `before()` could never pass and
E2E shard 3 failed on both browsers. Applies the same fix the other
overlay specs already use: stub the derived-metrics fetch, then switch to
Interactivity before asserting overlay points.

Pre-existing on this branch — shard 3 was already red on the master merge
commit, before the rename.

中文:csv-export-overlay 访问的是智能体场景,因此会落到 E2E Normalized
Interactivity 模式,而该模式会隐藏非官方运行覆盖层,导致 before() 中的
`.unofficial-overlay-pt` 断言永远无法通过,E2E shard 3 在两种浏览器下均失败。
此处采用与其他覆盖层测试一致的修复方式:先拦截派生指标请求,再切换到
交互性模式后断言覆盖层数据点。

该问题在本次重命名之前就已存在:master 合并提交上的 shard 3 已是红色。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(agentic): make normalized interactivity the canonical frontier

Compute the true Pareto frontier once in E2E Normalized Interactivity space and reuse that exact winner set on E2E latency, Interactivity, and TTFT without a second local Pareto pass.\n\n中文:修复(智能体):将端到端归一化交互性设为统一 Pareto 前沿,并让端到端延迟、交互性与 TTFT 横轴复用完全相同的优胜点集合,不再进行第二次局部 Pareto 筛选。

* fix(agentic): align canonical frontier e2e coverage

让非持久化 AgentX 测试数据在旧坐标轴上继续渲染,同时保持持久化数据受规范化前沿约束。更新非官方运行测试,使其符合规范化前沿策略,并隔离图例移除场景中的硬件排他规则。

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: functionstackx <47992694+functionstackx@users.noreply.github.com>
functionstackx and others added 28 commits August 27, 2026 00:46
…emiAnalysisAI#897)

Each featured model row in the landing/compare hero now shows its
full-color brand mark (Kimi, DeepSeek, Zhipu/GLM, MiniMax, Qwen)
next to the model name. Icons sourced from lobe-icons (MIT); the
Kimi mark sits on its dark app tile so the white K stays visible in
light mode.
Follow-up to SemiAnalysisAI#894: set the white-and-blue Kimi mark on its brand black
rounded tile so it renders full-color and stays visible on light
backgrounds, use it for the Kimi models on /inference and for Moonshot
AI on /model, and remove the now-unreferenced monochrome kimi.svg.

中文:跟进 SemiAnalysisAI#894:将白蓝配色的 Kimi 图标置于品牌黑色圆角底板上,使其以全彩渲染
且在浅色背景下清晰可见;/inference 的 Kimi 系列模型与 /model 的 Moonshot AI
均改用该图标,并删除不再被引用的单色 kimi.svg。
SemiAnalysisAI#904)

Render vendor marks beside each hardware label in the /compare pair cards
(en + zh). NVIDIA uses its official full-color green mark (#76B900, new
nvidia-color.svg); AMD's brand guidelines only allow the standard black or
reversed-white logo, so amd.svg joins the shared monochrome dark-invert set,
which reproduces the official reversed treatment in dark mode. Vendors
without a logo mapping (e.g. Teacup) render no mark.

中文:在 /compare 对比卡片中的每个硬件名称旁展示厂商 logo(中英文页面)。
NVIDIA 使用官方全彩绿色标志(#76B900,新增 nvidia-color.svg);AMD 品牌
规范仅允许标准黑色或反白 logo,因此 amd.svg 加入共享的单色暗色反转集合,
在暗色模式下呈现官方反白效果。无 logo 映射的厂商不渲染标志。
…ual Z.ai mark (SemiAnalysisAI#903)

- /overview scorecard model names (desktop matrix + mobile list, en/zh) now
  render the same full-color creator marks as the /inference chart caption
  and /model pages, via the shared ModelLogo component.
- GLM models now use the actual Z.ai brand mark (angular Z glyph) instead of
  the retired blue Zhipu molecule: new zai-color.svg / models/zai.svg set the
  white mark on Z.ai's brand-black rounded tile (same treatment as Kimi), so
  it stays brand-accurate and visible in both themes.
- Every surface follows: /inference captions, /model pages, and the /compare
  AgentX ledger all pick up the Z.ai mark through the shared mappings.

中文:/overview 记分卡的模型名称(桌面矩阵与移动端列表,中英文页面)现与
/inference 图表说明和 /model 页面一致,通过共享的 ModelLogo 组件渲染全彩
开发商 logo。GLM 系列模型改用 Z.ai 当前的官方品牌标识(斜切 Z 字形),
不再使用已弃用的智谱蓝色分子图标:新增 zai-color.svg 与 models/zai.svg,
将白色标识置于 Z.ai 品牌黑色圆角底板上(与 Kimi 的处理一致),在深浅两种
主题下均清晰可见。/inference、/model 与 /compare AgentX 榜单等页面通过共享
映射同步更新。
…al Z.ai mark (SemiAnalysisAI#905)

The model dropdown now renders each model's full-color creator logo beside
its name (dropdown rows and closed trigger). MultiSelect options gain an
optional leading icon.

- GLM models and the 'Z.ai (Zhipu AI)' developer mapping now use the actual
  Z.ai "Z" mark (new self-contained white-on-black app tile at
  logos/models/zai.svg) instead of the legacy Zhipu asterisk mark; the
  landing AgentX ledger row is updated too and the stale
  logos/models/zhipu.svg is removed.
- Kimi models switch from the monochrome dark-inverted glyph to the
  full-color Kimi app tile (logos/models/kimi.svg); kimi.svg leaves
  MONOCHROME_LOGO_FILES.
- New unit tests pin GLM -> models/zai.svg and assert every model logo is
  full-color (no currentColor fills) except monochrome-by-design marks
  (OpenAI).

中文:模型下拉选择器现在在模型名称旁显示全彩开发商 Logo(下拉选项与已选状态均支持)。GLM 系列改用 Z.ai 官方 "Z" 标志(新增自包含的黑底白字应用图标 logos/models/zai.svg),替换旧的智谱标志;首页 AgentX 结果列表同步更新。Kimi 系列改用全彩 Kimi 应用图标,不再依赖深色模式反色。新增单元测试确保 GLM 使用 Z.ai 标志、且所有模型 Logo 均为全彩。
…emiAnalysisAI#911)

Move the Share button from the Inference Performance header into the
per-chart control row, directly beside the download/export button, on
desktop. Keep a header Share on mobile since the chart control row is
hidden below the md breakpoint. ShareButton gains an optional className
prop so it can match the h-7 chart-control height.

中文:将 Share(分享)按钮从 Inference Performance 标题区移至每个图表
右上角的控制栏中,紧邻下载/导出按钮(桌面端)。由于图表控制栏在 md
断点以下隐藏,移动端在标题区保留 Share 按钮。ShareButton 新增可选的
className 属性,以匹配图表控制按钮的 h-7 高度。
Co-authored-by: Oren - Codex Agent <oren-codex-agent@users.noreply.github.com>
… model selector (SemiAnalysisAI#912)

The dashboard previously spent a full-width banner row on 'Learn more about
the {model} architecture'. Replace it with a compact icon link that sits
beside the closed model-selector trigger (mirroring the scenario selector's
info affordance). The banner copy and the MoE/attention/param badges move
into the icon's tooltip, and the link still deep-links to /model/[slug]
with the same analytics event. Models without a public slug render no icon.

中文:仪表板此前用一整行横幅展示"了解 {model} 模型架构"。现改为模型选择器
触发器旁的紧凑图标链接(与场景选择器的信息图标保持一致)。横幅文案及
MoE/注意力机制/参数量徽章移入图标的 tooltip,链接仍指向 /model/[slug]
并保留原有分析事件。无公开 slug 的模型不显示该图标。
Drops the Explore InferenceX card (overview/full-dashboard CTAs, platform
coverage copy, and per-model links) from the landing page in both English
and Chinese, along with its now-unused strings, imports, and the Cypress
assertions that covered it.
…miAnalysisAI#915)

The /compare index hero already renders full-color brand marks, but the
per-model catalog section headings below were plain text. Render the
shared ModelLogo beside each section h2 on both /compare and /zh/compare
so the DeepSeek, MiniMax, Kimi, GLM, Qwen, gpt-oss, and Llama sections
carry their marks. displayName is the Model enum value by contract, so
models without a configured logo simply render no mark.

中文:/compare 目录页每个模型区块的标题此前为纯文本。现在在 /compare 与
/zh/compare 的区块标题旁渲染共享的 ModelLogo 品牌标识(DeepSeek、
MiniMax、Kimi、GLM、Qwen、gpt-oss、Llama 等)。displayName 按约定即
Model 枚举值,未配置 logo 的模型不渲染任何标识。
…isAI#916)

Co-authored-by: functionstackx <functionstackx@users.noreply.github.com>
…lysisAI#919)

The landing page already gives AgentX maximal prominence (hero links, the
AgentX nav NEW badge, and the launch banner), so the centered
agentic-results announcement modal is redundant and just adds a dismissal
step on first load.

- Drop the agentic-results-launch-modal entry from the nudge registry
- Update registry unit tests (migrated-ID list, zh-route action test)
- Remove launch-modal suppression plumbing from cypress/support/e2e.ts
- Rewrite nudge-system.cy.ts landing specs around the banner + star modal
- Simplify navigation.cy.ts first-load specs (no modal to dismiss)
- Drop the stale storage-key clear in landing-performance.cy.ts
…nce on back-nav (SemiAnalysisAI#917)

The /model/[slug] embedded dashboard reuses GlobalFilterProvider and
InferenceProvider, whose URL-sync effects persist every state change into
the module-scoped share-link store in url-state.ts. That store deliberately
survives client-side navigations, so the embed's autoSelectAllGpus selection
(every chip config with data) overwrote it, and Back-navigating to a bare
/inference rebuilt with the embed's auto-populated chip configs and an
expanded config changelog the user never selected.

Fix: introduce EphemeralUrlStateContext, a scope in which useUrlState's
write functions are no-ops (reads stay live, so explicit share links into
/model pages keep working). EmbeddedModelDashboard wraps its providers in
the scope, and the chart components' rememberChartStateInUrl stamping is
skipped inside it for the same reason.

中文:修复 /model/[slug] 页面内嵌仪表板在返回 /inference 时泄漏自动填充状态的问题。
内嵌仪表板复用与主仪表板相同的 provider,其 URL 同步逻辑会把自动全选的 chip config
写入跨页面导航存活的模块级共享状态存储,导致点击浏览器返回后 /inference 意外显示
自动填充的 chip config 和展开的 config changelog。本次修复引入
EphemeralUrlStateContext:该作用域内 useUrlState 的写入为空操作(读取不受影响,
指向 /model 页面的分享链接仍然有效),并同时跳过图表组件的
rememberChartStateInUrl 状态回写。
…iAnalysisAI#918)

The /overview matrix listed rows model-major with the single-turn 8K/1K
row first, so legacy 8K/1K rows (DeepSeek V4 Pro, MiniMax M3) sat above
most of the AgentX rows the page headlines. Rows now group by scenario
within each category band: AgentX rows lead, 8K/1K rows follow, each
group in MODEL_CONFIG declaration order. Defaults still sit above
maintenance and deprecated rows, and OVERVIEW_SCENARIOS keeps its
single-turn-first order so /run and /rankings headline selection is
unchanged.
…rence selector / 在首页模型列表与 /inference 选择器为 AgentX 模型添加 NEW 徽章 (SemiAnalysisAI#920)

Adds the shared NewBadge pill beside the six featured AgentX models (Kimi-K3, DeepSeek-V4-Pro, GLM-5.2, MiniMax-M3, Qwen-3.5-397B-A17B, Qwen3.8-Flash-Next) on the landing AgentX ledger and in the /inference model dropdown. Localized (NEW / 新) and covered by unit + Cypress tests.

中文:在首页 AgentX 模型列表和 /inference 模型下拉框中,为六个精选 AgentX 模型添加共享的 NewBadge 徽章(NEW / 新),并附带单元测试与 Cypress 测试。
…线标签新增全彩硬件厂商 Logo (SemiAnalysisAI#899)

* feat(chart): add full-color vendor logos to scatter line labels

Render each hardware vendor's official full-color mark (NVIDIA green
every roofline line-label pill in ScatterGraph. Logos are inlined as
data URIs so they render synchronously and survive html-to-image chart
export. Vendors without a public logo (Teacup Jalapeño) render unchanged.

中文:在 ScatterGraph 的曲线标签(roofline pill)左侧新增硬件厂商的官方全彩
Logo(NVIDIA 品牌绿 #76B900、AMD 官方黑色标识),置于白色小底块上以保证在任意
标签底色和明暗主题下品牌色清晰可见。Logo 以 data URI 内联,同步渲染且兼容
html-to-image 图表导出;无公开 Logo 的厂商(Teacup Jalapeño)保持原样。

* refactor(chart): drop white chip behind line-label vendor logos

Draw the full-color vendor marks directly on the pill with a transparent
background, so the area behind each logo keeps the exact line-label fill
shade (including gradient fills) instead of a white chip.

中文:移除 Logo 后面的白色底块,全彩厂商标识直接以透明背景绘制在标签上,
Logo 背后保持与曲线标签完全相同的填充色(含渐变填充)。

* feat(chart): AMD arrow-only mark, OpenAI mark for Jalapeño labels

Use just the arrow symbol from the official AMD logo (no wordmark) so it
reads as a square mark like the other vendor icons at label size, and
map Jalapeño (Teacup) to the OpenAI mark in the official reversed-white
variant used on colored backgrounds.

中文:AMD 标识改为官方 Logo 中的箭头符号(不含 AMD 字标),在标签尺寸下与
其他厂商图标一致呈方形;Jalapeño(Teacup)映射为 OpenAI 标识,采用官方
反白(白色)变体以适配彩色标签底色。
…erves immediately (SemiAnalysisAI#922)

The assembled OverviewPageData (including the models array order from SemiAnalysisAI#918)
is stored in the derived blob cache under 'overview-page-v1' with a long
TTL that survives deploys, so production kept serving the old
single-turn-first order. Version the key to 'overview-page-v2', matching
the run/ranking page-data convention.
…emove TensorWave (SemiAnalysisAI#926)

Add AMD and NVIDIA to CAROUSEL_ORGS with display labels 'AMD Lisa Su' and
'NVIDIA Jensen' (both orgs already have quotes from Dr. Lisa Su and Jensen
Huang in QUOTES). Remove TensorWave from the landing strip; its quote stays
on /quotes. Tests updated accordingly.

中文:在首页支持者栏新增 AMD 与 NVIDIA,显示标签分别为 'AMD Lisa Su' 和
'NVIDIA Jensen'(两家公司的 Lisa Su 博士与 Jensen Huang 评价已存在于
QUOTES 中)。同时将 TensorWave 从首页支持者栏移除,其评价仍保留在
/quotes 页面。测试已相应更新。
… / 移除悬浮在页脚上的重复 GitHub 加星卡片 (SemiAnalysisAI#923)

* fix(landing): remove duplicate GitHub star card overlaying the footer / 移除悬浮在页脚上的重复 GitHub 加星卡片

The github-star-modal nudge (immediate trigger, landing scope) rendered as a
fixed bottom-right card on every homepage visit, covering the footer and
duplicating the star control that the footer grid (footer-star-cta) and the
header already provide. Per the existing design system the persistent GitHub
CTA belongs in the footer, so the floating duplicate is removed; the
engagement-triggered star-nudge toast on the dashboard scope is unchanged.

Also let long footer link labels (e.g. Land Acknowledgement) wrap inside
their grid column instead of overlapping the neighboring column.

* fix(footer): balance link columns so the More section no longer wraps below the grid / 平衡页脚链接列,使 More 区块不再换行到下方

The footer links grid was grid-cols-3 with four groups, so the 13-link
More group wrapped alone onto a second row as one very long column,
leaving a large hole next to Legal/Contribute. Following the balanced
single-row pattern of the NVIDIA and Cursor footers:

- xl+: one row of four groups; More gets a double-width track with its
  links flowing in two sub-columns; Legal gets a slightly wider track so
  "Land Acknowledgement" wraps between words instead of mid-word
- below xl: a two-column grid with More spanning the full width, which
  removes the cramped mid-word breaks at 375-1024px
- hyphens-auto as a progressive nicety for any remaining long-word wraps

* chore(footer): remove the 中文版/English language link from the More section / 从 More 区块移除中文版/English 语言链接

The header language toggle remains the way to switch locales.

---------

Co-authored-by: wenyao <wenyao@semianalysis.com>
…闭的内嵌面板,不再遮挡图表 (SemiAnalysisAI#927)

* fix(legend): replace collapse/expand overlay with closable in-flow panel

The sidebar chart legend previously expanded into an absolute overlay
that covered the plot, toggled by a Collapse/Expand button. Rework it
Epoch-style:

- Open legend is a normal in-flow panel beside the chart — it never
  overlaps the plot; the chart reclaims full width when closed
- X button in the panel header fully closes the legend
- A panel button at the chart's top-right reopens it
- Remove the Collapse/Expand button and overlay positioning
- Cap legend item width (w-fit max-w-full + truncate min-w-0) so long
  labels ellipsize inside the panel instead of overflowing the chart
- Export temporarily opens a closed legend so exports keep the legend
- i_legend=0 now means fully hidden (was: narrow collapsed)

中文:将侧边图例的 Collapse/Expand 悬浮层改为 Epoch 风格的内嵌面板:
打开时图例作为普通布局元素位于图表右侧,不再遮挡图表;面板内的 X
按钮可完全关闭图例,图表顶部右侧的面板按钮可重新打开。超长标签在
面板内省略号截断,导出时会临时展开已关闭的图例。i_legend=0 现表示
完全隐藏。

* fix(legend): content-width panel, no search bar, subtler styling

- Legend column now sizes to the widest label (min 12rem, max 24rem)
  so full series names display without truncation
- Removed the legend search input and its filtering/analytics plumbing;
  the panel header is now just the close (X) button
- Toned down panel styling to match Epoch: plain background with a
  subtle border instead of the shaded accent box

图例面板按最宽标签自适应宽度(最小 12rem,最大 24rem),完整显示系列名称;
移除图例搜索框及其过滤与埋点逻辑,面板头部仅保留关闭按钮;
面板样式参照 Epoch 弱化:使用普通背景与更淡的边框,取消强调色底色。

* fix(collectivex): default KV legend to open under new closed semantics

CollectiveXKvSection initialized legendExpanded to false, which under the
new sidebar semantics (false = fully hidden) loaded KV charts with only
the reopen button. Start expanded instead. Flagged by Bugbot.

CollectiveXKvSection 原先将 legendExpanded 初始化为 false;在新的侧边栏
语义下(false = 完全隐藏),KV 图表加载时只显示重新打开按钮。现改为默认
展开。该问题由 Bugbot 发现。
…chet gate / 设计系统:排版令牌、图表字号常量与棘轮检查 (SemiAnalysisAI#932)

Introduce a small governed typography layer and stop new drift:

- @theme tokens in globals.css: text-2xs (11px) / text-3xs (10px) micro
  sizes (font-size only, no line-height pairs, so the codemod below is
  pixel-identical) and named tracking tokens tracking-eyebrow (0.16em),
  tracking-eyebrow-wide (0.2em), tracking-heading (-0.04em); register the
  tracking tokens with tailwind-merge in lib/utils.ts. Give --font-mono a
  real system stack instead of bare `monospace`.
- Codemod 165 arbitrary values across 54 files (en + zh mirrors):
  text-[11px]→text-2xs, text-[10px]/text-[0.65rem]→text-3xs,
  tracking clusters→named tokens, tracking-[0.1em]→tracking-widest.
  text-[9px], 0.28/0.32em, and -0.06em stay allowlisted for manual review.
- New src/lib/d3-chart/typography.ts (CHART_TYPE + px() + export font
  stacks) adopted by chart-setup, axis-labels, watermark, radar,
  scatter-points, layer-renderer, knownIssueAnnotations, and
  useChartExport. Chart font sizes stay in TS because the html-to-image
  export path cannot resolve CSS variables for font-size. OG-image
  renderers (Satori) are exempt by design.
- cva-based <Heading> and <Eyebrow> (button.tsx pattern) with exemplar
  adoption; broader heading migration continues file-by-file on touch.
- Ratchet gate: scripts/check-typography.ts + typography-allowlist.json
  (11 remaining offenders across 8 files, the migration burndown), pure
  logic unit-tested in src/lib/typography-gate.ts, wired into the lint CI
  workflow and lefthook pre-commit. New offenders fail; the allowlist can
  only shrink (--update).
- docs/typography.md + AGENTS.md note so contributors and coding agents
  follow the token system.

中文:引入受治理的排版令牌体系:新增 text-2xs/text-3xs 微型字号令牌与
tracking-eyebrow/tracking-eyebrow-wide/tracking-heading 字距令牌(仅设置
font-size,不附带行高,代码迁移保持像素级一致);为 --font-mono 配置真实
等宽字体栈;通过 codemod 将 54 个文件(含 zh 镜像页)中的 165 处任意值迁
移到令牌;新增共享图表字号常量模块 CHART_TYPE(图表字号必须留在 TS 中,
因为 PNG 导出路径无法解析 CSS 变量);新增 cva 版 <Heading>/<Eyebrow> 组
件;新增 check:typography 棘轮检查脚本与允许列表(剩余 11 处待迁移),并
接入 CI 与 lefthook;补充 docs/typography.md 文档与 AGENTS.md 说明。

Co-authored-by: Claude <noreply@anthropic.com>
…6-08-28

# Conflicts:
#	.claude/skills/write-inferencex-blog/iso_interactivity.py
#	.env.example
#	.github/workflows/apply-run-overrides.yml
#	.github/workflows/cache-refresh.yml
#	.github/workflows/claude.yml
#	.github/workflows/ingest-agentic-results.yml
#	.github/workflows/ingest-results.yml
#	.github/workflows/lint.yml
#	.github/workflows/stage-results.yml
#	.github/workflows/tests-e2e.yml
#	.github/workflows/tests-unit.yml
#	AGENTS.md
#	README.md
#	README_zh.md
#	bun.lock
#	docs/architecture.md
#	docs/collectivex.md
#	docs/data-pipeline.md
#	docs/state-ownership.md
#	docs/tco-calculator.md
#	docs/testing.md
#	lefthook.yml
#	package.json
#	packages/app/content/blog/kimi-k3-the-manos-the-mythos-the.mdx
#	packages/app/content/blog/ultra-high-interactivity-on-nvidia.mdx
#	packages/app/content/blog/vera-rubin-nvl72-vs-gb200-nvl72-inference.mdx
#	packages/app/content/blog/zh/kimi-k3-the-manos-the-mythos-the.mdx
#	packages/app/content/blog/zh/ultra-high-interactivity-on-nvidia.mdx
#	packages/app/content/blog/zh/vera-rubin-nvl72-vs-gb200-nvl72-inference.mdx
#	packages/app/cypress/component/footer.cy.tsx
#	packages/app/cypress/component/gpu-graph.cy.tsx
#	packages/app/cypress/component/header.cy.tsx
#	packages/app/cypress/component/inference-chart-controls.cy.tsx
#	packages/app/cypress/component/multi-select.cy.tsx
#	packages/app/cypress/component/scatter-graph.cy.tsx
#	packages/app/cypress/e2e/api-documentation.cy.ts
#	packages/app/cypress/e2e/chart-overflow-continuation.cy.ts
#	packages/app/cypress/e2e/collectivex.cy.ts
#	packages/app/cypress/e2e/csv-export-overlay.cy.ts
#	packages/app/cypress/e2e/custom-user-values.cy.ts
#	packages/app/cypress/e2e/gpu-compare-agentic-detail.cy.ts
#	packages/app/cypress/e2e/inference-chart.cy.ts
#	packages/app/cypress/e2e/landing-performance.cy.ts
#	packages/app/cypress/e2e/model-architecture.cy.ts
#	packages/app/cypress/e2e/navigation.cy.ts
#	packages/app/cypress/e2e/nudge-system.cy.ts
#	packages/app/cypress/e2e/overlay-legend-remove.cy.ts
#	packages/app/cypress/e2e/overlay-optimal-only.cy.ts
#	packages/app/cypress/e2e/overview.cy.ts
#	packages/app/cypress/e2e/speed-overlay.cy.ts
#	packages/app/cypress/e2e/throughput-calculator.cy.ts
#	packages/app/cypress/e2e/ttft-x-axis-toggle.cy.ts
#	packages/app/cypress/e2e/unofficial-watermark.cy.ts
#	packages/app/cypress/e2e/zh-pages.cy.ts
#	packages/app/cypress/fixtures/api/collectivex-latest.json
#	packages/app/cypress/fixtures/api/collectivex-run-159.json
#	packages/app/cypress/fixtures/api/collectivex-runs.json
#	packages/app/cypress/support/overlay-fixtures.ts
#	packages/app/package.json
#	packages/app/scripts/capture-cypress-fixtures.ts
#	packages/app/src/app/(dashboard)/current-inferencex-image/page.tsx
#	packages/app/src/app/about/page.tsx
#	packages/app/src/app/api/unofficial-run/route.test.ts
#	packages/app/src/app/api/v1/benchmark-siblings/route.ts
#	packages/app/src/app/api/v1/benchmarks/history/route.ts
#	packages/app/src/app/api/v1/benchmarks/route.ts
#	packages/app/src/app/api/v1/collectivex/latest/route.test.ts
#	packages/app/src/app/api/v1/collectivex/latest/route.ts
#	packages/app/src/app/api/v1/collectivex/runs/[runId]/route.fixtures.test.ts
#	packages/app/src/app/api/v1/collectivex/runs/[runId]/route.test.ts
#	packages/app/src/app/api/v1/collectivex/runs/[runId]/route.ts
#	packages/app/src/app/api/v1/collectivex/runs/route.test.ts
#	packages/app/src/app/api/v1/collectivex/runs/route.ts
#	packages/app/src/app/api/v1/invalidate/route.ts
#	packages/app/src/app/api/v1/overview/route.test.ts
#	packages/app/src/app/api/v1/overview/route.ts
#	packages/app/src/app/api/v1/workflow-info/route.ts
#	packages/app/src/app/blog/[slug]/page.tsx
#	packages/app/src/app/blog/page.tsx
#	packages/app/src/app/compare-per-dollar/[slug]/page-client.tsx
#	packages/app/src/app/compare/[slug]/opengraph-image.tsx
#	packages/app/src/app/compare/[slug]/page-client.tsx
#	packages/app/src/app/compare/page.tsx
#	packages/app/src/app/glossary/page.tsx
#	packages/app/src/app/layout.tsx
#	packages/app/src/app/llms.txt/route.ts
#	packages/app/src/app/manifest.ts
#	packages/app/src/app/overview/page.tsx
#	packages/app/src/app/sitemap.ts
#	packages/app/src/app/zh/about/page.tsx
#	packages/app/src/app/zh/blog/[slug]/page.tsx
#	packages/app/src/app/zh/blog/page.tsx
#	packages/app/src/app/zh/compare-per-dollar/[slug]/page.tsx
#	packages/app/src/app/zh/compare-per-dollar/page.tsx
#	packages/app/src/app/zh/compare-precision/page.tsx
#	packages/app/src/app/zh/compare-spec-decode/page.tsx
#	packages/app/src/app/zh/compare/page.tsx
#	packages/app/src/app/zh/glossary/page.tsx
#	packages/app/src/app/zh/overview/page.tsx
#	packages/app/src/components/about/agentx-faq.tsx
#	packages/app/src/components/about/faq-data-zh.ts
#	packages/app/src/components/about/faq-data.ts
#	packages/app/src/components/calculator/CalculatorTable.tsx
#	packages/app/src/components/calculator/FleetPlanner.tsx
#	packages/app/src/components/calculator/ThroughputBarChart.test.ts
#	packages/app/src/components/calculator/ThroughputBarChart.tsx
#	packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx
#	packages/app/src/components/calculator/interpolation.ts
#	packages/app/src/components/calculator/url-seed.ts
#	packages/app/src/components/calculator/useThroughputData.test.ts
#	packages/app/src/components/calculator/useThroughputData.ts
#	packages/app/src/components/collectivex/CollectiveXDisplay.tsx
#	packages/app/src/components/collectivex/CollectiveXKvSection.tsx
#	packages/app/src/components/collectivex/CollectiveXRunsTable.tsx
#	packages/app/src/components/collectivex/data.test.ts
#	packages/app/src/components/collectivex/data.ts
#	packages/app/src/components/dashboard-shell.tsx
#	packages/app/src/components/evaluation/ui/ChartDisplay.tsx
#	packages/app/src/components/favorites/favorite-presets.ts
#	packages/app/src/components/footer/footer.tsx
#	packages/app/src/components/gpu-power/GpuPowerDisplay.tsx
#	packages/app/src/components/gpu-specs/gpu-specs-content.tsx
#	packages/app/src/components/header/header.tsx
#	packages/app/src/components/inference/InferenceContext.tsx
#	packages/app/src/components/inference/agentic-point/point-summary.tsx
#	packages/app/src/components/inference/agentic-point/server-metric-cards.tsx
#	packages/app/src/components/inference/agentic-point/sibling-nav.test.ts
#	packages/app/src/components/inference/agentic-point/sibling-nav.tsx
#	packages/app/src/components/inference/hooks/useChartData.test.ts
#	packages/app/src/components/inference/hooks/useChartData.ts
#	packages/app/src/components/inference/hooks/useInterpolatedTrendData.ts
#	packages/app/src/components/inference/inference-chart-config.json
#	packages/app/src/components/inference/measured-power-direction.test.ts
#	packages/app/src/components/inference/replay/ReplayPanel.tsx
#	packages/app/src/components/inference/replay/__tests__/buildReplayTimeline.test.ts
#	packages/app/src/components/inference/replay/buildReplayTimeline.ts
#	packages/app/src/components/inference/types.ts
#	packages/app/src/components/inference/ui/AgenticOptimizationNote.tsx
#	packages/app/src/components/inference/ui/ChartControls.tsx
#	packages/app/src/components/inference/ui/ChartDisplay.tsx
#	packages/app/src/components/inference/ui/ChartTooltip.tsx
#	packages/app/src/components/inference/ui/ComparisonChangelog.tsx
#	packages/app/src/components/inference/ui/CustomGpuValuePanel.tsx
#	packages/app/src/components/inference/ui/GPUGraph.tsx
#	packages/app/src/components/inference/ui/ModelArchitectureDiagram.tsx
#	packages/app/src/components/inference/ui/OffloadHaloLegendKey.tsx
#	packages/app/src/components/inference/ui/ScatterGraph.decoration.test.tsx
#	packages/app/src/components/inference/ui/ScatterGraph.tsx
#	packages/app/src/components/inference/utils.ts
#	packages/app/src/components/inference/utils/best-series-per-sku.test.ts
#	packages/app/src/components/inference/utils/best-series-per-sku.ts
#	packages/app/src/components/inference/utils/parallelism-label.test.ts
#	packages/app/src/components/inference/utils/parallelism-label.ts
#	packages/app/src/components/inference/utils/point-identity.test.ts
#	packages/app/src/components/inference/utils/point-identity.ts
#	packages/app/src/components/inference/utils/quickFilters.test.ts
#	packages/app/src/components/inference/utils/tooltip-parallelism.test.ts
#	packages/app/src/components/inference/utils/tooltip-utils.test.ts
#	packages/app/src/components/inference/utils/tooltipUtils.ts
#	packages/app/src/components/landing/landing-page.tsx
#	packages/app/src/components/latest-image/latest-image-content.tsx
#	packages/app/src/components/overview/overview-history-detail-link.tsx
#	packages/app/src/components/overview/overview-history-window-select.tsx
#	packages/app/src/components/overview/overview-nav-link.tsx
#	packages/app/src/components/overview/overview-navigation.test.tsx
#	packages/app/src/components/overview/overview-navigation.tsx
#	packages/app/src/components/overview/overview-page.tsx
#	packages/app/src/components/overview/overview-reference-select.tsx
#	packages/app/src/components/overview/overview-scorecard.tsx
#	packages/app/src/components/overview/overview-switcher-focus.test.tsx
#	packages/app/src/components/overview/use-wide-viewport.ts
#	packages/app/src/components/quotes/quotes-data.test.ts
#	packages/app/src/components/quotes/quotes-data.ts
#	packages/app/src/components/reliability/ui/ChartControls.tsx
#	packages/app/src/components/reliability/ui/ChartDisplay.tsx
#	packages/app/src/components/share-buttons.tsx
#	packages/app/src/components/submissions/SubmissionsTable.tsx
#	packages/app/src/components/tab-nav.tsx
#	packages/app/src/components/trends/HistoricalTrendsDisplay.tsx
#	packages/app/src/components/ui/chart-display-helpers.test.tsx
#	packages/app/src/components/ui/chart-display-helpers.tsx
#	packages/app/src/components/ui/chart-legend.tsx
#	packages/app/src/components/ui/chart-selectors.tsx
#	packages/app/src/components/ui/data-table.tsx
#	packages/app/src/components/ui/date-range-picker.tsx
#	packages/app/src/components/ui/multi-date-picker.tsx
#	packages/app/src/components/ui/searchable-select.tsx
#	packages/app/src/components/unofficial-run-provider.tsx
#	packages/app/src/components/zh/zh-tab-intro.tsx
#	packages/app/src/hooks/api/use-ai-chart.ts
#	packages/app/src/hooks/api/use-benchmark-history.ts
#	packages/app/src/hooks/api/use-benchmark-siblings.ts
#	packages/app/src/hooks/api/use-benchmarks.test.ts
#	packages/app/src/hooks/api/use-benchmarks.ts
#	packages/app/src/hooks/api/use-comparison-changelogs.ts
#	packages/app/src/hooks/useChartContext.test.ts
#	packages/app/src/lib/api-cache.test.ts
#	packages/app/src/lib/api-cache.ts
#	packages/app/src/lib/api-documentation.ts
#	packages/app/src/lib/api-route-catalog.test.ts
#	packages/app/src/lib/api-route-catalog.ts
#	packages/app/src/lib/api.ts
#	packages/app/src/lib/benchmark-api-view.test.ts
#	packages/app/src/lib/benchmark-api-view.ts
#	packages/app/src/lib/benchmark-run-selection.ts
#	packages/app/src/lib/benchmark-transform.ts
#	packages/app/src/lib/chart-utils.ts
#	packages/app/src/lib/client-navigation.ts
#	packages/app/src/lib/collectivex-lazy-ingest.test.ts
#	packages/app/src/lib/collectivex-lazy-ingest.ts
#	packages/app/src/lib/compare-slug.test.ts
#	packages/app/src/lib/compare-slug.ts
#	packages/app/src/lib/compare-ssr-zh.ts
#	packages/app/src/lib/compare-ssr.test.ts
#	packages/app/src/lib/compare-variant-ssr-zh.ts
#	packages/app/src/lib/d3-chart/D3Chart/useD3ChartRenderer.ts
#	packages/app/src/lib/d3-chart/chart-update.ts
#	packages/app/src/lib/d3-chart/layers/scatter-points.ts
#	packages/app/src/lib/data-mappings.test.ts
#	packages/app/src/lib/data-mappings.ts
#	packages/app/src/lib/dynamic-colors.test.ts
#	packages/app/src/lib/dynamic-colors.ts
#	packages/app/src/lib/glossary-zh.ts
#	packages/app/src/lib/glossary.ts
#	packages/app/src/lib/i18n.ts
#	packages/app/src/lib/model-architectures.ts
#	packages/app/src/lib/nudges/landing-banner.ts
#	packages/app/src/lib/nudges/registry.test.ts
#	packages/app/src/lib/nudges/registry.tsx
#	packages/app/src/lib/overview-data.server.test.ts
#	packages/app/src/lib/overview-data.server.ts
#	packages/app/src/lib/overview-data.test.ts
#	packages/app/src/lib/overview-data.ts
#	packages/app/src/lib/overview-links.test.ts
#	packages/app/src/lib/overview-links.ts
#	packages/app/src/lib/tab-meta-zh.ts
#	packages/app/src/lib/tab-meta.ts
#	packages/app/src/lib/test-fixtures.ts
#	packages/app/src/lib/url-state.test.ts
#	packages/app/src/test/setup-local-storage.ts
#	packages/constants/src/framework-aliases.ts
#	packages/constants/src/gpu-keys.ts
#	packages/constants/src/metric-keys.ts
#	packages/constants/src/models.test.ts
#	packages/constants/src/seo.ts
#	packages/db/package.json
#	packages/db/src/apply-overrides.ts
#	packages/db/src/backfill-aggregate-stats.ts
#	packages/db/src/backfill-full-response-interactivity.ts
#	packages/db/src/connection.ts
#	packages/db/src/etl/benchmark-mapper.ts
#	packages/db/src/etl/compute-aggregate-stats.test.ts
#	packages/db/src/etl/compute-aggregate-stats.ts
#	packages/db/src/etl/compute-chart-series.test.ts
#	packages/db/src/etl/compute-chart-series.ts
#	packages/db/src/etl/compute-trace-derived.test.ts
#	packages/db/src/etl/compute-trace-derived.ts
#	packages/db/src/etl/db-utils.ts
#	packages/db/src/etl/run-overrides.test.ts
#	packages/db/src/etl/run-overrides.ts
#	packages/db/src/ingest-ci-run.ts
#	packages/db/src/ingest-gcs-backup.ts
#	packages/db/src/queries/agentic-aggregates.ts
#	packages/db/src/queries/agentic-shared.ts
#	packages/db/src/queries/benchmark-siblings.ts
#	packages/db/src/queries/benchmarks.ts
#	packages/db/src/queries/derived-agentic-metrics.ts
#	packages/db/src/queries/trace-server-metrics.ts
#	packages/mcp/package.json
@aistackdev
aistackdev merged commit 18c21fb into master Aug 28, 2026
2 of 13 checks passed
aistackdev pushed a commit that referenced this pull request Aug 28, 2026
Bun 1.3.14 segfaults (SIGILL) during `next build`'s "Collecting page
data" phase on Next.js 16.3+ (oven-sh/bun#36866): it doesn't actually
export `markAsUncloneable` from node:worker_threads despite documenting
it, which breaks undici 8.x's build worker pool. This broke the prod
deploy after merging upstream's Next.js 16.3.1 bump (PR #20). Bun 1.3.13
builds this app cleanly (verified locally, reaches page-data collection
without crashing).

中文:将 Bun 版本锁定为 1.3.13,避免 1.3.14 在 next build 时段错误。
Bun 1.3.14 在 Next.js 16.3+ 的 "Collecting page data" 阶段会段错误
(SIGILL)(oven-sh/bun#36866):其文档声称支持
node:worker_threads.markAsUncloneable,但实际未导出,导致 undici 8.x
的构建 worker 池崩溃。合并上游 Next.js 16.3.1 升级后(PR #20)导致生产
部署失败。本地验证 Bun 1.3.13 可正常构建,能通过页面数据收集阶段。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants