Skip to content

[PowerX] enable NVL72 smart provisioning from measured GPU and Grace socket power / 基于实测 GPU 与 Grace socket 功耗为 NVL72 启用智能预配 - #1190

Merged
edwingao28 merged 302 commits into
masterfrom
feat/powerx-nvl72-smart-provisioning
Oct 16, 2026
Merged

edwingao28 merged 302 commits into
masterfrom
feat/powerx-nvl72-smart-provisioning

Conversation

@edwingao28

@edwingao28 edwingao28 commented Sep 20, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • GB200/GB300 NVL72 rows get All in Measured power: measured W/GPU and ACPI Grace-socket W feed the InferenceX power_model rack at PUE 1.1; rows without complete socket telemetry use the rack's modeled Grace (cpuBasis: modeled).
  • lib/power/power_model/ ports power_model/src/power_model file for file at the InferenceX#3887 merge commit 1e509932e: one .ts per .py, same class and field names; cli.py and __main__.py skipped (manifest). Closed-form profiles and their generator are removed; system-power-model.ts is a thin adapter.
  • The port rejects what pydantic rejects and formats what Python formats: wrong-family parts, chassis provenance, %g tie rounding, repr escaping, duplicate detail keys and validator error classes match the reference (findings table below).
  • Profit keys its power basis on measured vs modeled Grace, never interpolating across them; CSV adds cpu_basis and the port digest. Guide.
  • Depends on [PowerX] unify telemetry inspection and simplify power controls / 统一遥测查看并简化功耗控件 #1220; base merged through master at 23a6f9fe. Grace collection: InferenceX#3296.

AI model disclosure

  • Model/version: claude-opus-5-5 with delegated subagents; GPT-6 (variant unverified); claude-fable-5-1
  • Role: Opus: power_model port, parity fuzz, tests, docs; GPT-6: earlier implementation, review, tests; Fable: Bugbot fixes, revision pin, fuzz follow-up fixes, Chinese review, PR body

Validation

Check Scope Result
Parity fixture (power-model.parity.json) 1,572 Python-generated cases: every system, workload, scale-out state, socket input and rejection path, plus 240 seeded random inputs; totals, component trees, provenance, configuration all within 1e-12
Old closed form vs port 4,860 chassis and rack inputs agree to 5e-16
GB300 replay 594.191 W/GPU, 98.066 W/socket 1,013.8 facility W/GPU (1,063.0 with scale-out), matches the upstream CLI
Local at 872c360d vitest src/lib/power 1,745 tests pass
CI at 872c360d Claude review, Cursor Bugbot, Vercel pass; no test CI runs on this base, no GPU qualification

Differential fuzz against Python 1e509932e: seeded random inputs through the public API and every component class; errors compared by class and message.

Layer Cases Numbers compared Outside 1e-12
Public API create_power_model(...).estimate_breakdown(...) 30,000 1,505,361 0
UBB / HGX boards and NVSwitches 20,000 333,909 0
Bianca boards, DC converter, Grace, LPDDR5X, EPYC 225,000 2,899,806 0
Generic components, fans, PSU, rack power, NICs 87,500 1,128,727 0
Networking, systems, rack scale, catalog 38,850 1,981,977 0
Total 401,350 7,849,780 0; max relative 2.2e-15, all from fan x**3 (libm pow vs x*x*x)

Behavioural findings from the fuzz, each fixed in fe8caa48 with a test in power-model-validation.test.ts:

Finding Fix
Structural typing accepted wrong-family parts (B300 board + ConnectX-7 NIC, MI300 chassis + Hopper board, GB200 tray + GB300 board, GB300 rack + GB200 tray) instanceof guards with pydantic's model_type message
HGX chassis dropped a caller-supplied provenance forwarded to the system node
formatG rounded exact decimal ties half-up; Python's %g rounds half to even exact decimal expansion, ties to even
Enum error text lacked Python repr escaping py_repr
detail() returned the first duplicate key; dict() keeps the last last wins
ValueError inside a model validator escaped unwrapped surfaced as ValidationError

中文说明

  • GB200/GB300 NVL72 行启用 All in Measured 功耗:实测 W/GPU 与 ACPI Grace socket 功耗输入 InferenceX power_model 的机架模型(PUE 1.1);socket 遥测不完整的行使用机架建模的 Grace(cpuBasis: modeled)。
  • lib/power/power_model/ 按文件一一移植 power_model/src/power_model(InferenceX#3887 合并提交 1e509932e):每个 .py 对应一个 .ts,类名与字段名相同;跳过 cli.py 与 __main__.py。删除闭式 profile 及其生成器,system-power-model.ts 只是薄适配层。
  • 移植版与 pydantic 的拒绝行为和 Python 的文本格式一致:异族部件、chassis provenance、%g 平局舍入、repr 转义、重复 detail 键及校验器错误类型均与参考实现相同(见上表)。
  • Profit 按实测/建模 Grace 区分功耗基准,不跨基准插值;CSV 新增 cpu_basis 与移植版摘要。
  • 依赖 [PowerX] unify telemetry inspection and simplify power controls / 统一遥测查看并简化功耗控件 #1220;base 已合并至 master(23a6f9fe)。

验证: parity 夹具 1,572 个 Python 生成用例(含 240 个固定种子随机输入)全部在 1e-12 内;差分 fuzz 401,350 个用例、7,849,780 个数值无一超出 1e-12;872c360d 本地 vitest src/lib/power 1,745 项通过;CI(Claude review、Cursor Bugbot、Vercel)通过,此 base 不运行测试 CI,无 GPU 验证。


Note

High Risk
Touches core facility-power modeling, profit GW-year capacity math, and public inference CSV/table contracts for All in Measured; incorrect rack/Grace gating or curve selection would skew economics and API rows.

Overview
Replaces the closed-form chassis power profiles with a module-for-module TypeScript port of upstream InferenceX power_model, pinned via generate-power-model-parity.py and power-model.parity.json. modelSystemPower / All in Measured now covers GB200/GB300 NVL72 racks (estimateRackPower): equal compute-tray share of a modeled 18-tray rack at PUE 1.1, using validated Grace-socket telemetry when complete or modeled Grace otherwise (cpuBasis); GB200/GB300 are no longer blocked as unsupported hardware.

PowerX / views API: All in Measured tableRows keep every GPU-valid row (including unavailable system estimates with y: null and reasons); CSV exports those rows with blanks instead of only plotted series. Boundary labels align with GPU Level Measured, All in Provisioned, All in Measured; chart copy documents dual PUE and Grace input rules.

Profit Estimator (gated): Modeled/compare builds throughput from power-valid points only at the same target (no extrapolation across invalid knots); compare pairs use that curve for both bars and fall back to provisioned when no valid curve exists. UI drops the per-SKU unavailable disclosure list; dense compare charts get horizontal scroll (PNG export still full width). CSV/tooltips add power basis and model revision; NVL72 rows label measured vs modeled Grace and never mix bases in interpolation.

Docs, offline export (cpu_basis, port digest), and Cypress/vitest coverage expanded for AgentX multinode, NVL72 empty states, profit curves, and tooltip links to the pinned model.

Reviewed by Cursor Bugbot for commit 5edf102. Bugbot is set up for automated code reviews on this repo. Configure here.

@vercel

vercel Bot commented Sep 20, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
inferencemax-app Ready Ready Preview Oct 15, 2026 11:50pm UTC

Request Review

@edwingao28
edwingao28 marked this pull request as ready for review September 21, 2026 08:07
@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 4m 14s —— View job


Review complete — 🟢 LGTM, no blocking issues found

I reviewed the full diff against origin/feat/powerx-db-ingest, traced the new logic paths, and verified the Profit Estimator renders live at http://localhost:3000/profit-estimator-per-gigawatt (GB300/GB200 NVL72 SKUs plot correctly, 0 console errors).

Todo

  • Gather context (diff vs base, changed files)
  • Check CI status
  • Review core logic (modeled-system-power, system-power-model, profit-power, benchmark-mapper, metric-keys)
  • Review UI changes (ProfitEstimator, tooltips) + runtime verification
  • Review tests & docs coverage
  • Review Chinese copy
  • Post findings

What I verified

  • Rack topology invariants (system-power-model.profiles.json): gb200/gb300 both = 4 GPUs/tray × 18 trays = 72 GPUs, 2 Grace/tray. Consistent with unitGpuCount, the socketCount === units.length × graceSocketsPerComputeTray gate, and the "rack AC ÷ 72 GPUs" normalization (chassisAcWattsPerGpu reduces to rackAc/72 regardless of units.length). ✅
  • Fail-closed scrubbing (benchmark-mapper.ts): CPU-side keys are governed by cpu_power_valid independently of power_valid; scrubWithheldPowerMetrics correctly excludes the CPU subset from the GPU-side delete and vice-versa; absent verdict → withheld (no legacy rows predate it). Consistent across metric-keys.ts, power-publication.ts manifest, and the estimator's admission gate. ✅
  • Planning gate (profit-power.ts): only fully-measured units (chassisBasis === 'full') become planning figures; interpolation refuses to mix two bases between knots (powerSourceKey guard); partial/extrapolated trays are correctly excluded from pricing. ✅
  • Module vs. gpu-plus-grace basis: module reading is never scaled (covers whole tray incl. idle GPUs); gpu-plus-grace adds the sourced regulator-loss allowance on the GPU share only. Per-tray means divide deployment totals by units.length consistently. No division-by-zero (all units branches guarantee ≥1 element before modelTray). ✅
  • Both large JSON files parse; the offline exporter's per-hardware default PUE selection (1.3 air-cooled / 1.1 DLC) matches the dashboard's defaultSystemPue, so article figures track chart hovers. ✅
  • CSV/tooltip/label plumbing: column counts stay aligned when includeBasis is on (3 headers ↔ 3 basisColumns); provisioned rows (compare mode) fall back cleanly. useMemo/useCallback dep arrays updated for the new locale/powerBasisNotes reads. ✅
  • Test coverage: new functions/paths all have colocated tests (profit-power.test, modeled-system-power.test, system-power-model.test, benchmark-mapper.test, tooltip-utils.test, api-documentation.power.test, metric-keys.test, plus the Cypress basis-control spec). No missing-test gaps. ✅

Chinese copy

The diff touches user-visible zh strings in ProfitEstimatorChart.tsx, ProfitEstimatorDisplay.tsx, and tooltipUtils.ts (功耗口径 / 实测 + 估算 / 稳压损耗由模型估算 / tray assumptions, etc.). All are semantically faithful and read as natural technical Chinese, with product/hardware/profile/socket/tray terms correctly kept in English per the copy guide. No fidelity or register issues — nothing requiring maintainer confirmation.

Notes (non-blocking)

  • The tests-unit / tests-e2e / lint CI workflows haven't reported on this PR head yet (only Vercel + Claude route). The PR body states they pass locally; worth confirming the merge-gate checks are green before merge.
  • Runtime verification of the measured NVL72 path is not possible yet — no live row carries the CPU leg, so those rows report cpu-telemetry unavailable as the PR documents. The estimator's official-frontier-only scope makes the ?unofficialrun= overlay rule correctly N/A.

This is a carefully structured, well-tested change. No changes requested.
· feat/powerx-nvl72-smart-provisioning

@edwingao28
edwingao28 changed the base branch from feat/powerx-db-ingest to master September 21, 2026 08:13
@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 4m 31s —— View job


Claude Code Review — finalizing

  • Gather context (diff, CI status, dev server)
  • Review NVL72 rack model & planning gate (profit-power.ts, modeled-system-power.ts)
  • Review gpu-metrics-point API route + measured-metric config + power-compare utils
  • Runtime: Profit Estimator (NVL72 bars), boundaries chart, roles chart, power timeline — all render real data, 0 console errors
  • ChartDisplay timeline routing + boundary disclosures verified
  • Deep static review of large files (PowerTimeline, ScatterGraph, gpu-metrics route) — awaiting subagent
  • Post findings

edwingao28 and others added 23 commits September 24, 2026 15:59
Maps article figures 6–16 to their panels, documents the Timeline load
filter and validated-window summary, and adds powerFit to the views API
key table. State ownership lists i_ptconc.

中文:记录 PowerX 文章面板与 Timeline 负载筛选。将文章图 6–16 对应到各面板,说明
Timeline 负载筛选与有效窗口汇总,在视图 API 参数表中加入 powerFit,并在状态归属
文档中列出 i_ptconc。
Source labels in the baseline/comparator selects, role group and power
fit used English topology, attempt and recipe words on /zh. They now
follow the page locale; the read-only API keeps English.

中文:修复 PowerX 对比面板来源标签未本地化的问题。基准/对比来源下拉框、角色组和
功耗拟合中的拓扑、尝试次数与配方字样在 /zh 页面仍为英文,现在随页面语言显示;
只读 API 仍保持英文。
xmode=concurrency keeps loads without end-to-end latency and loads above
the chart cost limit, which e2e mode clips.

中文:新增测试,确认 xmode=concurrency 保留缺少端到端延迟的负载以及超出图表成本
上限的负载,而 e2e 模式会裁剪后者。
Keep 76 cases that pin published numbers, ingest/DB consistency, API
status contracts, or the required ?unofficialrun= overlay path. Drop the
other 499 audited cases, the local PostgreSQL acceptance harness, its
fixtures and the test:e2e:powerx script.

中文:删除冗余的 PowerX 测试和本地数据库验收框架。保留 76 个用例,覆盖发布数值、ingest/DB 一致性、API 状态契约以及必需的 ?unofficialrun= overlay 路径;删除其余 499 个审计用例、本地 PostgreSQL 验收框架及其 fixture,以及 test:e2e:powerx 脚本。
Conflicts were edits to db-ingest tests that the cleanup removed; they
resolve to the db-ingest side. The shared overlay timeline spec keeps
only this branch's share-link case.

中文:合并 db-ingest 分支的 PowerX 测试清理。冲突来自本分支对 db-ingest 中已删除测试的修改,均按 db-ingest 一侧解决;共享的 overlay 时间线 spec 只保留本分支的 share-link 用例。
Keep 10 cases for the views API numbers, the mean x statistic and the
required ?unofficialrun= overlay paths. Drop the other 55 audited cases,
trim the topology E2E case to its overlay filter assertion, and restore
the timeline spec timing.

中文:删除冗余的 chart-coverage 测试。保留 10 个用例,覆盖 views API 数值、mean x 统计量以及必需的 ?unofficialrun= overlay 路径;删除其余 55 个审计用例,将 topology E2E 用例精简为 overlay 过滤断言,并补回 timeline spec 的计时条目。
Keep 8 cases: signed same-concurrency deltas, the least-squares fit and
R², disaggregated fits per allocated GPU, the window-bounded peak pool
power, and the ?unofficialrun= overlay panels. Drop the other 41 audited
cases and restore the powerx-compare spec timing.

中文:合并 chart-coverage 的测试清理,并删除冗余的 article 测试。保留 8 个用例:带符号的同并发差值、最小二乘拟合与 R²、按分配 GPU 计算的 disaggregated 拟合、验证窗口内的峰值 GPU 池功耗,以及 ?unofficialrun= overlay 面板;删除其余 41 个审计用例,并补回 powerx-compare spec 的计时条目。
topologyLabel dropped the "=" from every part, so offload modes read
"offloadoff". Word values now keep a space ("offload off"); numeric and
unknown tokens stay compact (TP4, DP?).

中文:修复 topology 标签中的文字取值。topologyLabel 会删除每个字段的 "=",导致 offload 模式显示为 "offloadoff"。现在文字取值保留空格("offload off"),数字和未知值仍保持紧凑格式(TP4、DP?)。
中文:合并 topology 标签修复。
Track the full-record algorithm independently of source revisions. Recompute stale reads from retained samples, upgrade unchanged ingests, and add transactional stats-only backfill with version-aware caches.

Validation: local PGlite and real Blob cache regressions; old upsert fails the new unchanged-input regression. Workspace unit suite, lint, format, typecheck and typography pass. Cypress smoke: 56 component and 128 integration tests pass. No production migration or data repair executed.

中文:为 PowerX 完整记录统计增加算法版本。旧摘要可从保留样本只读重算,原样重新入库也能升级;新增事务化 stats-only 定向修复,并同步更新缓存版本和读取一致性检查。已通过本地数据库、真实缓存、仓库检查及浏览器 smoke;未执行生产迁移或数据修复。
中文:合并最新 master,保留双方文档改动,同步统计版本说明并重新生成 skill 完整性校验清单。
Remove the availability panel, point-count summary, historical rings and
their legend key, the power-curve caption, selector hints, and per-panel
method notes, so measured metrics read like every other dashboard metric.
Panel subtitles stay in exported images only. Comparison sources get short
"hardware · date" labels that add details only where two sources would
otherwise look the same.

中文:精简 PowerX 实测指标视图。移除可用性面板、数据点统计、历史数据圆环及其图例、
功率曲线图注、选择器提示和各面板的方法说明,使实测指标与仪表板其他指标的交互保持一致。
面板副标题仅保留在导出图片中;对比数据源改用“硬件 · 日期”短标签,只有在两个数据源
无法区分时才补充细节。
Chip Config already follows the standard dashboard path; GB200/GB300 NVL72
DSR1 8K/1K rows carry no power telemetry, so Measured Power had nothing to
plot. The measured-axis empty state now says so. Best per SKU also keeps
the full selection when no config reports the metric, matching the rule
that metric coverage never narrows the selection.

中文:说明所选芯片配置缺少实测功耗的情况。芯片配置本身沿用仪表板的标准逻辑;
DSR1 8K/1K 的 GB200/GB300 NVL72 数据没有功耗遥测,因此实测功耗图表无点可画。
实测坐标轴的空状态现在会明确说明这一点。当没有任何配置提供该指标时,
“每个 SKU 仅显示最佳配置”会保留完整选择,符合“指标覆盖范围不收窄选择”的规则。
The Concurrency axis and the Service Statistic label shipped earlier in
this branch; the x-axis spec still expected the old option count and the
unprefixed "Interactivity" label.

中文:更新 X 轴测试,适配本分支已上线的“并发数”选项和带统计量前缀的坐标轴标签。
Falling back to every selectable config re-ran engine-conflict resolution
when no config reported the metric, which could raise a toast over an
empty chart. The empty selection is harmless now that the availability
panel is gone; the measured empty-state hint stays.

中文:恢复“每个 SKU 仅显示最佳配置”在指标无数据时的原有回退逻辑。改为回退到全部可选配置后,
一旦没有任何配置提供该指标,就会重新执行引擎冲突处理,可能在空图表上弹出提示。
可用性面板移除后,空选择已不再有副作用;实测空状态提示保持不变。
The source selects are no-export, so exported same-service and
same-concurrency images no longer said which baseline and comparator
produced the numbers. Both panels now carry an export-only
"Baseline → Comparator" line; the screen is unchanged.

中文:在导出图片中标明对比数据源。数据源下拉框不参与导出,因此同服务水平与同并发对比的导出图片
无法看出基准和对比对象。两个面板现在都带有仅在导出时显示的“基准 → 对比对象”一行,屏幕显示不变。
…ves them

`packages/db/src/lib/gpu-metric-stats.ts` and
`packages/db/src/queries/gpu-metrics.ts` are bundled into the
`/api/v1/gpu-metrics-point` App Route. Turbopack does not rewrite
`.js`-suffixed relative specifiers to their `.ts` sources, so the
`bun run build` step of every E2E shard failed with
"Module not found: Can't resolve '../etl/gpu-metrics-csv.js'" and
"Can't resolve '../lib/gpu-metric-stats.js'". Use extensionless
specifiers, matching the other app-reachable db modules.

中文:`gpu-metric-stats.ts` 与 `queries/gpu-metrics.ts` 会被打包进
`/api/v1/gpu-metrics-point` 路由,Turbopack 不会把带 `.js` 后缀的相对
导入映射到 `.ts` 源文件,导致 E2E 各分片的 `bun run build` 报 Module not
found。改为不带扩展名的导入,与其他被应用引用的 db 模块保持一致。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FxD3ovk3KPrcotWoeNuUAL
Resolve conflicts with the moved base: keep versioned stats recovery
(now via groupBySeries), both views-api doc edits, both readonly-views
additions, and the condensed data-pipeline readers paragraph, moving the
versioned-digest rule into powerx-persistence-recovery.md. Document
service source labels in the skills reference and regenerate its
integrity manifest.

中文:将 feat/powerx-db-ingest 合并到文章对齐分支,解决与已更新基线的冲突:
保留版本化统计恢复逻辑(改用 groupBySeries),保留两侧对 views-api 文档和
readonly-views 文档的改动,data-pipeline 采用精简后的读取段落,版本化摘要规则
移至 powerx-persistence-recovery.md。在 skills 参考文档中说明服务数据源标签,
并重新生成完整性清单。
…rison

Date comparison dropped ?unofficialrun= rows, its Timeline ignored the
per-date legend, and the Concurrency axis fell back to the scatter
chart. GPUGraph now draws overlay runs in their run colour and dash and
splits concurrency sweeps per date, run and topology. The Timeline
shares its series colours and date toggles; table, CSV and panels
follow the same toggles.

中文:日期对比会丢失 ?unofficialrun= 数据,其 Timeline 忽略按日期的图例,并发数 X 轴会退回散点图。
GPUGraph 现在以运行配色和虚线绘制非官方运行,并按日期、运行和拓扑拆分并发扫描。
Timeline 沿用其序列配色和按日期显隐,表格、CSV 和面板也遵循同一套显隐。
Concurrency shipped for every sequence earlier in this branch; the
phone-width Chinese Agentic spec still counted four options.

中文:修正中文 Agentic X 轴选项测试。本分支此前已为所有场景加入并发数选项,
而手机宽度的中文 Agentic 测试仍按四个选项计数。
Brings #1224 (OperatorX: compare hardware and inspect kernel timelines,
926a8e5) into the PowerX DB-ingest branch.

Conflict resolutions:
- docs/dashboard-readonly-views.md: both branches appended a paragraph at
  the same spot in the 中文说明 section (master: OperatorX feature gate and
  page-owned /api/v1/operatorx/* routes; this branch: GPU telemetry DB-first
  read and full-record statistics). Kept both, OperatorX first to mirror
  the order of the English section.
- packages/skills/skills/inferencex-api/integrity.json: both sides updated
  the sha256 of references/dashboard-views.md, which itself auto-merged
  with both additions. Regenerated with
  `node packages/skills/scripts/update-integrity.mjs` instead of picking
  a side.

Auto-merged without conflict: package.json and packages/db/package.json
(master's admin:db:ingest:operatorx scripts only, no dependency changes;
`bun install --frozen-lockfile` is clean and bun.lock is untouched),
packages/app/src/lib/api-route-catalog.ts (api-route-catalog.test.ts
passes with no digest edits), views-api/docs/extensions.ts, and the skills
references/dashboard-views.md.

中文:将 master(#1224 OperatorX 跨硬件对比与内核时间线)合并进
feat/powerx-db-ingest。两处冲突均为同位置追加:docs/dashboard-readonly-views.md
的中文说明段落两侧都保留(OperatorX 段落在前,与英文段落顺序一致);skills
integrity.json 中 dashboard-views.md 的哈希用 update-integrity.mjs 重新生成。
依赖与 lockfile 无变化,路由目录测试通过。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FxD3ovk3KPrcotWoeNuUAL
Moving the Concurrency date comparison onto GPUGraph dropped the link
its official tooltips had in the scatter chart. The date-comparison
tooltip now renders it and opens the focused Timeline in place, as
overlay points already did.

中文:日期对比图中的官方数据点恢复“View power trace”。并发数日期对比改用 GPUGraph 后,
官方点 tooltip 丢失了散点图中的这个链接;现在日期对比 tooltip 会显示该链接,
并像非官方点一样在页内打开聚焦的 Timeline。
Brings in OperatorX #1224 via the base. Conflicts: the views query-key
tables keep this branch's inference and gpu-metrics rows and drop the
operatorx view, which #1224 no longer publishes; the registry.ts review
digest and the skills integrity file are recomputed for the merged files.

中文:将 powerx-db-ingest 合并到文章对齐分支,带入 OperatorX #1224。冲突处理:只读视图的查询参数表
保留本分支的 inference 与 gpu-metrics 行,并删除 #1224 已不再发布的 operatorx 视图;
registry.ts 的审阅摘要与 skills integrity 文件按合并后的内容重新计算。
edwingao28 and others added 6 commits October 14, 2026 16:57
中文:在当前镜像视图的选择器说明中补充 includeHistory。
Drops the resurrected PowerX recovery doc and restores master's data-pipeline.md; keeps the 9deb8d7 import fix and its digest.

中文:合并经过验证的 #1167 冲突解决结果。去掉被重新加回的 PowerX recovery 文档并恢复 master 的 data-pipeline.md;保留 9deb8d7 的导入修复及其 digest。
…provisioning

中文:将 feat/powerx-article-parity 合并到 feat/powerx-nvl72-smart-provisioning。
中文:将 power model 移植版本固定到 InferenceX 合并提交 69f12085e。
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 1m 48s —— View job


Re-review — 🟢 LGTM, no blocking issues found

Re-reviewed against origin/feat/powerx-article-parity, focused on the single new commit since the prior LGTM at 5edf1029.

  • Gather context (new commits: 55e4706a revision pin + 57b80149 parent-sync merge)
  • Review new/changed logic
  • Check CI status
  • Runtime verification
  • Chinese copy pass (N/A — see below)
  • Post findings

What changed since the last review

One production-relevant commit: 55e4706a "chore: pin power model port to InferenceX 69f12085e" — a pure revision-pointer update, no model math or logic touched. It moves modelRevision / sourceUrl / the generator REVISION from 5cfc833d… to the #3887 merge commit 69f12085e… while keeping sourceTree identical at ceec5a03…, so the upstream power_model tree is unchanged and no numerics move. The other new commit, 57b80149, is a parent-sync merge whose files cancel against the base.

Verified

  • No numeric drift. Diffed power-model.parity.json across 5edf1029…55e4706a by parsing both revisions: the only changed key is modelRevision — every one of the ~1,572 parity cases is byte-identical. Consistent with the unchanged sourceTree. ✅
  • No stale references. git grep 5cfc833d across packages/ + docs/ returns nothing; all three sites (generator REVISION, manifest.json, parity.json) move to 69f12085e together. ✅
  • Pin stays internally consistent. power-model-parity.test.ts:159-160 asserts parity.modelRevision === manifest.modelRevision and manifest.sourceUrl contains manifest.modelRevision; all three were updated in lockstep, so the guard holds. ✅
  • User-visible surface correct. SYSTEM_POWER_MODEL_REVISION = manifest.modelRevision and the tooltip renders estimate.modelRevision.slice(0, 12) → 69f12085e6ad, linking to SYSTEM_POWER_MODEL_SOURCE_URL (= the new commit URL). It's a plain git SHA (no app-sha256: prefix), so slice(0,12) is the whole label — no broken prefix-strip. ✅
  • Runtime. /profit-estimator-per-gigawatt?c_power=modeled and /inference?i_metric=y_utilityModeledWatts&i_seq=agentic-traces both render real data, 0 console errors (1 benign pre-existing preload warning). The measured NVL72 path still can't be exercised live (no row carries the Grace-socket leg; PR depends on [PowerX] unify telemetry inspection and simplify power controls / 统一遥测查看并简化功耗控件 #1220) as documented, so it stays covered by the parity fixture + nvl72-power.fixture.ts unit/API tests.
  • Chinese copy. 55e4706a touches only revision strings / a Chinese commit-body line — no user-visible /zh website string changed. N/A.

Notes (non-blocking)

  • The PR body still references 1e509932e as the pinned commit in places, while the actual pin is now 69f12085e. Cosmetic — worth refreshing so reviewers aren't confused by the stale SHA.
  • CI on this head: only the Claude route reports on this feature-branch PR; the authoritative tests-unit / tests-e2e / lint merge-gate workflows run on the shared-tree PR per the PR body. Confirm those are green before merge — that's the authoritative signal, not this comment.

No new issues introduced by the revision pin. No changes requested.
· feat/powerx-nvl72-smart-provisioning

Base automatically changed from feat/powerx-article-parity to master October 15, 2026 22:46
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 3m 27s —— View job


Re-review — 🔴 One blocking issue: UI/API parity broken by the latest commit

Re-reviewed against origin/master, focused on the single new production commit since the prior LGTM at 55e4706a.

  • Gather context (new commit 8a04fb18; CI status)
  • Review new/changed logic
  • Runtime verification (inference All-in-Measured, Best on)
  • Chinese copy pass (N/A — see below)
  • Post findings

What changed since the last review

One production commit: 8a04fb18 "fix: keep table-only SKUs in Best per SKU when other SKUs are ranked" — it addresses the open Cursor Bugbot "Best filter drops table-only SKUs" finding. A new helper withUnrankedSkus (best-series-per-sku.ts) is added and wired into the UI bestHwTypes memo (InferenceContext.tsx:1322) so that, under "Best per SKU", a SKU with GPU-valid table rows but no rankable estimate (e.g. an NVL72 row whose all-in estimate is unavailable) stays visible instead of being hidden by a ranked SKU elsewhere in the selection.

🔴 BLOCKING — the matching API change is missing (parity regression)

The fix was applied to the UI path only. The public views-API filter in packages/app/src/lib/views-api/series.ts:422 still reads:

.filter((point) => !best || bestHwKeys.size === 0 || bestHwKeys.has(point.hwKey))

Both paths build their rows from the same allInMeasuredTableData, so for identical inputs the dashboard table (now via withUnrankedSkus) and /api/v1/views/inference tableRows (still via bestHwKeys.has) now return different row sets under Best — the API drops exactly the table-only SKUs the UI keeps. This is the read-only-coverage parity rule in AGENTS.md ("Reuse the dashboard's pure transformation functions so the API and UI cannot silently calculate different results"), and it's precisely the case prior reviews warned about: "it would need an explicit retain-unrankable-rows carve-out in both the UI and the API with a matching regression test, to preserve parity." Changing a frontend-view filter without the matching API change is 🔴 BLOCKING on PR review.

Details + a drop-in fix are in the inline comment on series.ts:422. A views-API regression test (Best on + one ranked SKU + one table-only SKU) should land in the same change (extensions.test.ts / route.test.ts).

Verified (the rest is clean)

  • UI helper logic is correct. withUnrankedSkus adds a candidate's hwKey only when its baseSku has no winner in best, so SKUs that already won keep only their winner (no losing series re-added) and chart-only unranked series are not promoted. The three new unit cases in best-series-per-sku.test.ts pin exactly this. ✅
  • No crash / stale-closure risk. The memo deps are unchanged and correct; tableCandidates is derived once and reused. Runtime: /inference?i_metric=y_utilityModeledWatts&i_seq=agentic-traces&i_best=1 renders real data, 0 console errors (1 benign pre-existing preload warning). ✅
  • Chinese copy: 8a04fb18 adds no user-visible /zh strings (only code + tests + comments). N/A.

Notes (non-blocking)

  • CI now runs the authoritative merge gates on this head (base is master): Lint & Format green; Tests (Unit/E2E/Skills) in progress at review time — confirm green before merge.
  • The measured NVL72 path still can't be exercised live (no live row carries the Grace/module leg) as documented; the table-only scenario above is reachable by construction via the retain-measured-rows path and the NVL72 fixtures.

Once the API series.ts filter is brought in line with the UI (plus a parity test), this is good to go.
· feat/powerx-nvl72-smart-provisioning

Comment thread packages/app/src/lib/views-api/series.ts Outdated
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 2m 18s —— View job


Re-review — 🔴 BLOCKING: the UI/API parity issue from the last review is still open

Re-reviewed against origin/master, focused on what changed since the prior 🔴 BLOCKING review at 8a04fb18.

  • Gather context (new commits since prior review, CI status)
  • Re-check the prior 🔴 BLOCKING finding (UI/API parity in series.ts)
  • Review new/changed logic
  • Runtime verification
  • Post findings

What changed since the last review

Only one new commit: cd65abb1 "test: align NVL72 E2E expectations with modeled Grace sockets" — E2E-test-only (powerx-compare.cy.ts +2, profit-estimator.cy.ts +9/-4). No production code changed, so the blocking parity finding from the last review is not addressed.

🔴 BLOCKING — still open: series.ts:422 drops table-only SKUs the UI keeps

Commit 8a04fb18 fixed the UI Best-per-SKU set to retain table-only SKUs via withUnrankedSkus(best, graph.data, tableCandidates) (InferenceContext.tsx:1322), but the matching API change was never made. The views-API tableRows filter still reads:

.filter((point) => !best || bestHwKeys.size === 0 || bestHwKeys.has(point.hwKey))

Both paths build rows from the same allInMeasuredTableData, so under "Best per SKU" with at least one ranked SKU present, the dashboard table now keeps GPU-valid NVL72 rows (all-in estimate unavailable) while /api/v1/views/inference tableRows drops them — a silent UI/API divergence. Per AGENTS.md "Read-only coverage for public views", a changed frontend-view filter without the matching API change is 🔴 BLOCKING. Details + a drop-in fix (reuse withUnrankedSkus) and the required views-API regression test are in the inline comment on series.ts:422.

Verified (otherwise clean)

  • UI side is correct. withUnrankedSkus adds a candidate's hwKey only when its baseSku has no winner in best, so ranked SKUs keep only their winner and table-only SKUs stay visible — matches the new best-series-per-sku.test.ts cases. The bestHwTypes memo deps are correct. ✅
  • Runtime. /inference?i_metric=y_utilityModeledWatts&i_seq=agentic-traces&i_best=1 renders real data, 0 console errors (1 benign pre-existing preload warning). The measured NVL72 path still can't be exercised live (no row carries the Grace/module leg); the table-only scenario is reachable by construction via the retain-measured-rows path + NVL72 fixtures. ✅

Notes (non-blocking)

  • CI on this head (base master): Lint & Format green; Tests (Unit/E2E/Skills) in progress at review time — confirm green before merge.

Once the API series.ts filter is brought in line with the UI (plus a parity test), this is good to go. Everything else in the PR was cleared in prior comprehensive reviews.

Comment thread packages/app/src/lib/views-api/series.ts Outdated
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 2m 16s —— View job


Re-review — 🔴 One blocking issue: stale contract digest fails Tests (Unit)

Re-reviewed against origin/master, focused on the prior 🔴 BLOCKING UI/API parity finding and the new commit fc1cd29c that addresses it.

  • Gather context (new commit fc1cd29c)
  • Verify the series.ts Best-filter parity fix + regression test
  • Check CI status
  • Runtime verification (inference All-in-Measured, Best on)
  • Post findings

The prior UI/API parity finding is fixed ✅

fc1cd29c brings the views-API tableRows Best filter in line with the dashboard: series.ts:427-433 now computes tableHwKeys = withUnrankedSkus(bestHwKeys, mapped, allInRows) and filters on it, reusing the same helper the UI calls in InferenceContext.tsx:1322 (withUnrankedSkus(best, graph.data, tableCandidates)). Both derive best from bestSeriesPerSku(…, direction) over the same ranked point set and fall through to "keep everything" when !best/bestHwKeys.size === 0, so the two paths can no longer diverge. The new regression test (series.test.ts, "keeps table-only all-in SKUs under best=true like the dashboard") pins exactly the scenario the earlier reviews required — ranked winner h200_trt only in series, but both gb200_trt (table-only) and h200_trt in tableRows. Good.

🔴 BLOCKING — the digest for the edited series.ts was not bumped

Tests (Unit) is red on this head. fc1cd29c changed src/lib/views-api/series.ts but left its sourceSha256 in api-route-catalog.ts:1399 stale, so the contract-sync guard fails:

src/lib/views-api/series.ts changed. … update its shared-source SHA-256 digest in src/lib/api/api-route-catalog.ts.
Expected: "d904952b…"  (recorded)
Received: "8697fb60…"  (actual)

I recomputed the hash locally — the current series.ts is 8697fb60…, confirming the recorded digest is stale. Per AGENTS.md "API reference and contract synchronization", confirm whether the human reference / OpenAPI / Chinese copy need updates (the tableRows best=true behavior now retains table-only SKUs), then bump the digest. Drop-in fix in the inline comment on api-route-catalog.ts:1399.

Runtime verification ✅

/inference?i_metric=y_utilityModeledWatts&i_seq=agentic-traces&i_best=1 renders real data, 0 console errors (1 benign pre-existing preload warning).

CI status

  • Lint & Format ✅ · Tests (Unit) 🔴 (the digest guard above) · Tests (E2E) / Tests (Skills) in progress.

Once the series.ts digest in api-route-catalog.ts is refreshed (and any docs it flags are reviewed), Tests (Unit) should go green and the PR is good to go — the parity fix itself is correct and tested.

Comment thread packages/app/src/lib/api/api-route-catalog.ts Outdated
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 1m 36s —— View job


Re-review — 🟢 LGTM, both prior BLOCKING findings resolved

Re-reviewed against origin/master, focused on the single new commit since the prior 🔴 BLOCKING review at fc1cd29c.

  • Gather context (new commit 2d194554; CI status)
  • Verify the stale-digest BLOCKING finding is resolved
  • Verify the UI/API parity fix + regression test
  • Check CI status
  • Post findings

Both prior 🔴 BLOCKING findings are fixed

1. UI/API parity (series.ts) — fixed in fc1cd29c. The views-API tableRows Best filter now computes tableHwKeys = withUnrankedSkus(bestHwKeys, mapped, allInRows) (only when best && bestHwKeys.size > 0) and filters on it (series.ts:425-434), reusing the same withUnrankedSkus helper the UI calls in InferenceContext.tsx:1321. Both paths derive best from bestSeriesPerSku(…, direction) over the same ranked set and fall through to "keep everything" when !best/bestHwKeys.size === 0, so the two can no longer diverge. The regression test (series.test.ts:161 "keeps table-only all-in SKUs under best=true like the dashboard") pins exactly the scenario the earlier reviews required. bun vitest run src/lib/views-api/series.test.ts → 27 passed locally. ✅

2. Stale contract digest — fixed in fc1cd29c/2d194554. I recomputed sha256(series.ts) locally = 8697fb60…, which now matches the recorded sourceSha256 in api-route-catalog.ts:1399. bun vitest run src/lib/api/api-route-catalog.test.ts → 14 passed. The Tests (Unit) gate that was red on the prior head should now go green. ✅

What 2d194554 adds (the only new commit)

A docs-only follow-up to the guard message: it bumps the series.ts digest and documents the best=true table-only-SKU behavior in views-api/docs/inference.ts (tableRows description + the operation summary, EN+ZH). docs/inference.ts is the documentation registry (not a digested shared-contract source), so no further digest bump is required. The added Chinese — (没有可排名估算的 SKU 保留其全部观测点) — is semantically faithful and reads as natural technical Chinese, with SKU/optimal/best kept in English per the copy guide. No fidelity/register issues.

CI status

  • Lint & Format ✅ · Tests (Unit / E2E / Skills) in progress at review time (base is master, so the authoritative gates run here) — the two targeted suites I ran locally (api-route-catalog, series) both pass, so the digest guard failure from the last review is cleared.

Once Tests (Unit) reports green on this head, this is good to merge — the parity fix is correct and tested, and the digest is now in sync. Everything else in the PR was cleared in prior comprehensive reviews.

@edwingao28
edwingao28 merged commit 719fd0b into master Oct 16, 2026
55 checks passed
@edwingao28
edwingao28 deleted the feat/powerx-nvl72-smart-provisioning branch October 16, 2026 00:12

This branch was successfully deployed

1 active deployment
Preview — 2d194554 Deployed Oct 15, 2026 by vercel[bot]
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.

3 participants