feat(app): whitepaper section and MI355X Kimi K3 revenue-per-gigawatt executive summary / 新增白皮书栏目及 MI355X Kimi K3 每吉瓦收入执行摘要 - #1010
Conversation
…n Kimi K3 Add a whitepaper section modeled on the blog: `/whitepaper` lists every paper as a card and `/whitepaper/[slug]` renders a research-paper style executive-summary landing page (eyebrow, title, meta row, Download PDF CTA, profit-estimator link, Figure 1 hero, four KPI cards, summary, key findings, method, assumptions table, sources, closing CTA). Both routes ship Simplified Chinese siblings under `/zh/whitepaper`. - `src/lib/whitepapers.ts`: typed registry with parallel `en`/`zh` copy, chrome dictionary, locale-paired metadata (hreflang via `enAlternates`/`zhAlternates`, site OG image), and Report/Breadcrumb/ CollectionPage JSON-LD authored by "SemiAnalysis InferenceX Team". - Register `/whitepaper` in `ZH_MIRRORED_ROUTES`, the sitemap (`localizedPair` + Figure 1 image), `llms.txt`, and the footer. - Client link components track `whitepaper_*` analytics events. - Tests: registry shape, slug uniqueness, metadata alternates, JSON-LD, sitemap inclusion, and locale-toggle coverage. Binary assets (PDF and Figure 1 PNG) are added separately under `public/whitepaper/<slug>/`; the pages reference the paths only. 中文:新增白皮书栏目,参照博客实现。`/whitepaper` 以卡片形式列出全部白皮书, `/whitepaper/[slug]` 渲染研究报告风格的执行摘要落地页(标签、标题、元信息、 下载 PDF 按钮、利润估算器链接、图 1、四张 KPI 卡片、摘要、核心发现、方法、 假设表、来源与结尾下载入口),并在 `/zh/whitepaper` 下提供简体中文镜像。 注册表 `src/lib/whitepapers.ts` 同时承载中英文文案、hreflang 元数据与 JSON-LD; 路由已登记至 `ZH_MIRRORED_ROUTES`、站点地图、`llms.txt` 与页脚,交互元素统一 上报 `whitepaper_*` 事件,并补充注册表、元数据与站点地图的单元测试。PDF 与 图 1 PNG 二进制资源另行提交至 `public/whitepaper/<slug>/`。
…PDF 与首图 Adds the downloadable executive summary PDF (cover plus two pages) and the Figure 1 hero image for the MI355X Kimi K3 revenue-per-gigawatt whitepaper, and updates the hero image dimensions on the detail page. 添加 MI355X Kimi K3 每吉瓦收入白皮书的可下载执行摘要 PDF(封面加两页)以及 图 1 首图,并更新详情页首图尺寸。
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Found 4 test failures on Blacksmith runners: Failures
|
…/ 调整白皮书标题并统一 PDF 版式 Renames the paper to "AMD Instinct MI355X Kimi K3 Can Generate Up to $32B of Revenue per GigaWatt per Year White Paper" with the subtitle "Executive Summary - AgentX Serving Economics Analysis" in both locales, and rebuilds the PDF with the header and footer artwork anchored to the page corners. 将白皮书标题改为 "AMD Instinct MI355X Kimi K3 Can Generate Up to $32B of Revenue per GigaWatt per Year White Paper",副标题为 "Executive Summary - AgentX Serving Economics Analysis"(中英文同步),并重新生成 PDF,使页眉 页脚图案贴合页面角落。
…e Paper" Title is now "AMD Instinct MI355X Kimi K3 Can Generate Up to $32B of Revenue per GigaWatt per Year" in the registry, tests, and the PDF cover. 标题改为 "AMD Instinct MI355X Kimi K3 Can Generate Up to $32B of Revenue per GigaWatt per Year",同步更新注册表、测试与 PDF 封面。
Landing page: dark hero with grid texture and a transparent MI355X board
overlay (hidden below md), three registry-driven KPI tiles ($32.6B revenue,
$16.5B profit, 50.7% margin) with a rental comparison bar ($10.3B, 31.5%,
$2.45/chip-hr), two figure cards that mirror the profit estimator header
(Kimi mark, ResultContext meta, TCO badge, source link, selling prices) with
theme-switched light/dark PNGs, and a two-column body with a sticky sidebar
(cover thumbnail, PDF button, on-this-page links). Figures scroll sideways
below sm with a hint.
Index: eyebrow, page heading, two-column card grid with cover thumbnail,
inline KPI row, tag badges, read link and PDF button; cards stack on phones.
Registry: KPI, comparison, figure and chart metadata move into
WHITEPAPER_COPY / the Whitepaper record (en + zh). Assets: cover.webp,
figure-{1,2}-*-{light,dark}.png, mi355x-transparent.png (1783x1073);
refreshed PDF; old figure-1-revenue-per-gigawatt.png removed. Tests cover
the registry shape and the rendered en/zh markup.
白皮书落地页与索引页重新设计:深色主题 Hero 加 MI355X 板卡透明图,三个来自
注册表的核心指标卡片与租赁对比条,两张与利润估算器表头一致的图表卡片(明暗主题
切换),以及带粘性侧栏(封面、PDF 按钮、本页目录)的双栏正文。索引页改为带封面
缩略图、指标行、标签和链接的双栏卡片。所有新文案均通过 WHITEPAPER_COPY 提供中英
双语,并补充了注册表与渲染测试。
…主题图表分段标签可读性 Compute-expense and license-fee labels stay dark ink on the light pink segments in the dark chart variants. 深色图表变体中,算力支出与授权费分段标签保持深色,以在浅粉色分段上保持可读。
| { | ||
| value: '$16.5B', | ||
| label: 'Profit per GW-year', | ||
| caption: 'Owned at hyperscaler volume, $1.50/chip-hr ($3.95 per chip-hour)', |
There was a problem hiding this comment.
Profit caption mixes cost figures
Medium Severity
The owned-profit KPI caption places $1.50/chip-hr beside $3.95 per chip-hour with no qualifier, so the parenthetical reads as a restatement of cost. $3.95 is profit per chip-hour (the owned counterpart of the rented $2.45), not another cost figure.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 6f5b546. Configure here.
Index (/blog, /zh/blog): eyebrow + page heading + intro, a wide featured card
for the newest post using its Open Graph image, a one-row tag filter ("All",
the 8 most frequent tags, "More tags" disclosure for the long tail; the
?tag= query contract is unchanged and now case-insensitive), and a
1/2/3-column card grid with OG thumbnails, date and reading time, clamped
subtitle, and up to 3 tag badges. Both locales render through one
BlogIndexContent server component fed by BLOG_COPY.
Post (/blog/[slug], /zh/blog/[slug]): hero with back link, first-tag
eyebrow, balanced display title, subtitle, meta row (author, date, reading
time, updated), linked tag badges; two-column body on lg with a 72ch prose
measure, full-column figures and tables, and a sticky right sidebar holding
the table of contents (CSS grid instead of the old fixed-position portal,
scroll-tracked active heading), share row (X, LinkedIn, copy link), and an
AgentX dashboard CTA card. Bottom: previous/next cards and a "More articles"
strip of the 3 posts sharing the most tags. Reading progress bar, hash
scroll, data-blog-section / data-blog-article hooks, share test ids,
analytics events, JSON-LD, RSS, sitemap, and en/zh behaviour are preserved.
Lib: getTopTags, getRelatedPosts, formatBlogDate, blogOgImagePath with
tests; new component tests for the index and post chrome.
列表页(/blog、/zh/blog):新增引导标签、页面标题与简介;最新文章以宽幅精选卡片
展示(使用其 Open Graph 图片);单行标签筛选("全部" + 8 个高频标签 +
"更多标签"折叠区),?tag= 查询参数行为保持不变并支持大小写不敏感;1/2/3 列
卡片网格包含 OG 缩略图、日期与阅读时长、两行截断的副标题以及最多 3 个标签。
中英文页面共用 BlogIndexContent 服务端组件与 BLOG_COPY 文案字典。
详情页(/blog/[slug]、/zh/blog/[slug]):页头包含返回链接、首标签引导、标题、
副标题、元信息行(作者、日期、阅读时长、更新时间)及可点击的标签;lg 及以上
为双栏布局,正文宽度 72ch,图表与表格占满主栏,右侧粘性侧栏包含目录(改用
CSS 网格替代旧的 fixed 定位方案,随滚动高亮当前章节)、分享按钮(X、LinkedIn、
复制链接)与 AgentX 仪表板 CTA 卡片。底部为上一篇/下一篇卡片以及按共同标签
推荐的 3 篇"更多文章"。阅读进度条、锚点滚动、data-blog-section /
data-blog-article 钩子、分享测试 ID、埋点事件、JSON-LD、RSS、站点地图与
中英文行为均保持不变。
工具函数:新增 getTopTags、getRelatedPosts、formatBlogDate、blogOgImagePath
及对应测试;新增列表页与详情页组件测试。
… 文章卡片缩略图改用文内图表或无文字底纹 The index and related-strip cards used the generated Open Graph image as the thumbnail, so every card repeated its own title and subtitle. Cards now take the first raster figure under public/images/<slug>/ (sorted by name; light/dark variants are split per theme through ThemedFigureImage when both exist). Posts without a figure get a tile on the site background with the whitepaper hero's dot grid drawn in the current text colour, a soft primary glow in one corner, and the first tag as a badge. No title text is rendered inside the tile. The featured card follows the same rule. Boxes keep the 1200/630 aspect and object-cover. New getPostThumbnail helper in src/lib/blog.ts (fs-based, server-only) with unit tests; index test updated for the thumbnail rule. 列表页与"更多文章"卡片此前以生成的 Open Graph 图片作为缩略图,导致每张卡片重复 显示自身标题与副标题。现改为使用 public/images/<slug>/ 下按文件名排序的第一张 位图(同时存在 light/dark 变体时通过 ThemedFigureImage 按主题切换)。无图表的 文章显示无文字底纹:站点背景色加白皮书页头的点阵网格(使用当前文字颜色),一角 带柔和的主色光晕,并以首个标签作为角标。精选卡片遵循同一规则。缩略图框保持 1200/630 比例与 object-cover。 新增 src/lib/blog.ts 中基于文件系统的 getPostThumbnail 辅助函数(仅服务端)及 单元测试;更新列表页测试以覆盖缩略图规则。
…hout figures / 无图表文章改用紧凑底纹与纯文字精选卡片 The newest posts have no figures, so the top of the index was rows of identical empty boxes and the featured card was half blank. Featured posts without a figure now render as a single text column (eyebrow, meta, display title, subtitle, tags, read link) with the grid texture on the card itself, fading to the right. Grid and related-strip cards without a figure use a 3/1 tile with a higher-contrast dot grid, the first tag bottom-left, and the reading time top-right in mono. Cards with figures keep the 1200/630 box. Both grids use items-start so rows no longer stretch to the tallest card. 最新文章没有图表,导致列表页顶部是一排排相同的空盒子,精选卡片也有一半是空白。 无图表的精选文章改为单列纯文字布局(引导标签、元信息、大号标题、副标题、标签、 阅读链接),网格底纹直接叠加在卡片背景上并向右渐隐。列表与"更多文章"中无图表 的卡片改用 3/1 比例的底纹块,点阵对比度略有提高,左下角为首个标签,右上角为 等宽字体的阅读时长。有图表的卡片保持 1200/630 比例。两个网格均使用 items-start, 行高不再被最高的卡片拉伸。
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.
There are 3 total unresolved issues (including 1 from previous review).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 999f730. Configure here.
| const current = posts.find((p) => p.slug === slug); | ||
| const others = posts.filter((p) => p.slug !== slug); | ||
| if (!current) return others.slice(0, limit); | ||
| const tags = new Set(current.tags); |
There was a problem hiding this comment.
Related posts crash without tags
Medium Severity
getRelatedPosts builds new Set(current.tags) while tags is optional on BlogPostMeta. Neighboring scoring already uses post.tags ?? [], so a published post that omits tags throws and the article page fails to render.
Reviewed by Cursor Bugbot for commit 999f730. Configure here.
| > | ||
| <Link | ||
| href={href} | ||
| className="focus-visible:outline-none before:absolute before:inset-0 before:z-10 before:content-['']" |
There was a problem hiding this comment.
Featured image is not clickable
Low Severity
The featured card's stretch-link overlay is contained by the text column's relative wrapper, so the thumbnail is not part of the hit target. BlogPostCard uses the same overlay pattern without that inner relative, and the image still scales on card hover, so the figure looks clickable but does nothing.
Reviewed by Cursor Bugbot for commit 999f730. Configure here.
…peline / 新增白皮书撰写 skill 及 PDF 与图表流水线 Adds .claude/skills/write-inferencex-whitepaper: SKILL.md covering the numbers workflow (estimator formulas, Steffen interpolation, sanity checks), copy and title rules, the house-style PDF pipeline (make_charts.py, build_pdf.py, render_pdf.js, cutout.py, fonts and header/footer artwork), asset installation, registry fields, landing-page anatomy, tests, and a pre-PR checklist. The example spec reproduces the shipped MI355X Kimi K3 paper. whitepapers.test.ts now asserts every referenced asset exists under public/; AGENTS.md points at the skill. 新增 .claude/skills/write-inferencex-whitepaper:SKILL.md 说明数据计算流程(估算器公式、Steffen 插值、复核)、文案与标题规范、SemiAnalysis 版式的 PDF 流水线(图表、排版、渲染、抠图脚本,字体与页眉页脚素材)、资源安装、注册表字段、落地页结构、测试与 PR 前检查清单。示例 spec 可完整复现已发布的 MI355X Kimi K3 白皮书。whitepapers.test.ts 新增资源文件存在性断言;AGENTS.md 增加指向该 skill 的说明。
|
|
||
|
|
||
| def b64(path: str) -> str: | ||
| return base64.b64encode(open(path, "rb").read()).decode() |
|
|
||
|
|
||
| def inline_svg(path: str) -> str: | ||
| s = open(path).read() |
| sys.exit(__doc__) | ||
| spec_path, out_dir = sys.argv[1], sys.argv[2] | ||
| spec_dir = os.path.dirname(os.path.abspath(spec_path)) | ||
| spec = json.load(open(spec_path)) |
| ) | ||
| mosaic, trace, badge = (b64(os.path.join(ASSETS, f"{n}.png")) for n in ("cover_mosaic", "trace", "badge")) | ||
| chip = b64(resolve(spec_dir, spec["cover"]["hardware_image"])) | ||
| logo = open(resolve(spec_dir, spec["chart"]["model_logo_svg"])).read().replace('height="1em"', 'height="18"').replace('width="1em"', 'width="18"') |
|
|
||
| html = f"<!doctype html><html><head><meta charset='utf-8'><title>{spec['title']}</title><style>{css(fonts, mosaic)}</style></head><body>{cover}{page1}{page2}</body></html>" | ||
| out = os.path.join(out_dir, "paper.html") | ||
| open(out, "w").write(html) |
| sys.exit(__doc__) | ||
| spec_path, out_dir = sys.argv[1], sys.argv[2] | ||
| spec_dir = os.path.dirname(os.path.abspath(spec_path)) | ||
| spec = json.load(open(spec_path)) |
| /> | ||
| ) : ( | ||
| <img | ||
| src={thumbnail.dark ?? thumbnail.light} |


Summary
Adds a whitepaper section to InferenceX and ships its first paper: AMD Instinct MI355X Kimi K3 Can Generate Up to $32B of Revenue per GigaWatt per Year (Executive Summary - Agentic Inference Serving Economics Analysis, SemiAnalysis InferenceX Team).
/whitepaperlists every paper as a card./whitepaper/amd-mi355x-32b-revenue-per-gigawatt-kimi-k3is a research landing page: dark hero with an MI355X render overlay, Download PDF and profit-estimator CTAs, three KPI tiles (revenue, profit, margin) with the rental comparison bar, two figure cards that mirror the/profit-estimator-per-gigawattchart header (owned at $1.50/chip-hr and rented at $3.00/chip-hr, light/dark plot variants), then summary, key findings, method, assumptions, sources with a sticky PDF/on-this-page sidebar./zh/whitepaperand/zh/whitepaper/<slug>mirror both routes in Simplified Chinese./whitepaper/<slug>/pdf/SemiAnalysis-InferenceX-Executive-Summary_AMD-MI355X-Revenue-per-Gigawatt-Kimi-K3.pdf(cover plus two pages, SemiAnalysis house style, two revenue bar charts: owned at hyperscaler volume at $1.50/chip/hr, and 3-year rental at $3.00/chip/hr, August 2026 pricing).src/lib/whitepapers.tsholds parallel en/zh copy, hreflang metadata and Report/Breadcrumb/CollectionPage JSON-LD.ZH_MIRRORED_ROUTES, sitemap (with cover image),llms.txt, and the footer. AGENTS.md and docs/i18n.md updated.whitepaper_*events.The numbers reproduce the dashboard's profit estimator exactly: 6,115 tok/s/GPU at P90 45 tok/s/user, 478,469 GPUs/GW at 2.09 kW, 60% utilization, 30% model license fee, OpenRouter pricing $3 / $0.3 cached / $15. Revenue $32.6B; profit $16.5B (50.7%) owned, $10.3B (31.5%) rented. vLLM only; no cross-vendor or cross-framework comparison.
Tests
whitepapers.test.ts(10 tests) plus additions tositemap.test.tsandi18n.test.ts; all pass.bun run lintandbun run check:typographypass.typecheckreports only the pre-existingcomponents/minecraft/*errors present onmain.中文说明
新增白皮书栏目并发布首篇白皮书《AMD MI355X 在 Kimi K3 2.8T 上每吉瓦最高可创造 320 亿美元收入》(执行摘要,作者 SemiAnalysis InferenceX 团队)。
/whitepaper以卡片列出全部白皮书;/whitepaper/<slug>为研究报告风格的落地页(标题、元信息、下载 PDF 按钮、利润估算器链接、图 1、四张 KPI 卡片、摘要、核心发现、方法、假设表、来源)。/zh/whitepaper与/zh/whitepaper/<slug>提供简体中文镜像。src/lib/whitepapers.ts承载中英文文案、hreflang 元数据与 JSON-LD;路由已登记至ZH_MIRRORED_ROUTES、站点地图、llms.txt与页脚。whitepapers.test.ts,并补充站点地图与 i18n 测试;lint 与排版检查通过。Articles redesign (
/blog,/blog/[slug], zh mirrors)public/images/<slug>/or a text-free 3:1 textured tile when none exists.getPostThumbnailhave tests (67 vitest passing).Whitepaper skill
.claude/skills/write-inferencex-whitepaper/documents how to produce the next paper: numbers workflow (estimator formulas, Steffen interpolation, sanity checks), copy and title rules, the house-style PDF pipeline (make_charts.py,build_pdf.py,render_pdf.js,cutout.py, fonts, header/footer artwork), asset installation, registry fields, landing-page anatomy, tests, and a pre-PR checklist.examples/mi355x-kimi-k3.jsonreproduces this paper's PDF.whitepapers.test.tsnow asserts every referenced asset exists underpublic/.