nvsim Dashboard 架构落地指南:Vite + 双通道(WASM + REST/WebSocket)如何把确定性 NV 金刚石磁力计仿真器搬进浏览器
本文依据 docs/adr/ADR-092-nvsim-dashboard-implementation.md 整理编写。RuView 仓库中的 nvsim 是一个用 Rust 编写的、完全确定性的 NV-diamond 系综磁力计正向仿真器(约 4.5M samples/s)。本 ADR 记录了为其构建官方前端控制台(nvsim Dashboard)的完整方案:通过 WASM 浏览器内运行 与 REST + WebSocket 连接自建服务器 两条并行通道,让同一份 TypeScript 客户端接口把真实 Rust 仿真器渲染成图表、十六进制帧、SHA-256 witness 等运维界面。读完本文,你不仅能掌握该仪表盘的架构决策、组件清单、REPL 指令集与快捷键全集,还能顺着源码把“确定性契约如何被前端断言”这一核心链路摸清。
1. 背景:给无头仿真器一个“人机界面”
nvsim crate(见 ADR-089-nvsim-nv-diamond-simulator.md)实现了一条完整的确定性正向仿真流水线:
场景 scene → 场源合成(Biot–Savart、磁偶极子、电流环、铁磁感应磁矩)→ 材料衰减 → NV 系综(4 个 ⟨111⟩ 轴、ODMR 线性读出代理、散粒噪声底)→ 16-bit ADC + lock-in 解调 → 定长 MagFrame 记录 → SHA-256 witness 见证。
该 crate 是纯 Rust、无头(headless)的。而用户提供的 NVSim Dashboard mockup(assets/NVSim Dashboard.zip,单文件 HTML,约 4200 行)演示了生产环境应有的操作面:四区应用外壳、可拖拽的场景图元、实时 ODMR + B 迹曲线、定长 MagFrame hex dump 面板、SHA-256 witness 面板、控制台 REPL、设置抽屉、命令面板与键盘工作流。问题在于 mockup 跑在 JS 合成仿真器上,无法兑现 nvsim 区别于“宣传式物理 demo”的确定性契约。
因此本 ADR 决定:完整实现该仪表盘,把它作为 nvsim 的官方前端,托管在 GitHub Pages,并由真实 Rust 仿真器通过两条并行通道驱动:
| 通道 | 载体 | 定位 |
|---|---|---|
| WASM in-browser | nvsim 编译为 wasm32-unknown-unknown,在 Web Worker 内运行 |
GitHub Pages 默认模式:无服务器、无上传、无遥测 |
| REST + WebSocket | 新的 nvsim-server 二进制(Axum) |
高吞吐工作负载、超长场景、录制数据回放、与非 WASM 版本对比运行(可选、需自建 host) |
两条通道共享同一 TypeScript 客户端接口,仪表盘对它们可互换使用。这与 RuView 的 WiFi-CSI / 60 GHz 生命体征栈(wifi-densepose-sensing-server + wifi-densepose-wasm)的双通道模式一脉相承,属于该模式在量子传感层的一次复制。
2. 决策摘要与六项目标
仪表盘的工程决策可归纳为:
- 前端:Vite + TypeScript + 轻量组件库(Lit 或原生 custom-elements),不用 React/Vue——mockup 是原生 DOM,且 SPA 体积预算需保持 < 300 KB gzipped。
- 仿真器通道:可插拔
NvsimClient接口,两种实现WasmClient(wasm32 + 专用 Web Worker + postMessage RPC)与WsClient(REST 控制面 + WebSocket 帧流)。 - 状态:IndexedDB 保存持久化设置与已存场景;单一
appStore(signals 或小型 observable)承载运行时状态。 - 托管:GitHub Pages 的
gh-pages分支,由 CI 在每次改动dashboard/或 nvsim 的 main 合并时构建发布。 - 版本绑定:仪表盘版本与 nvsim 版本严格绑定;WASM 二进制以字符串常量内嵌已发布 witness 的 SHA-256,若 WASM 上报 witness 与仪表盘对同一 nvsim 版本的期望 witness 不一致,则拒绝启动。
同一套 TypeScript 接口还将作为 npm 包(@ruvnet/nvsim-client)发布,允许第三方在自己的 UI 中驱动 nvsim 而无需 fork 仪表盘。
2.1 Goals(目标)
- 忠实还原 mockup:
NVSim Dashboard.zip中的每个面板、控件、模态框、命令与快捷键都需实现,不简化。 - 构造即确定(Deterministic by construction):所有图表、hex dump、witness 面板中的数字都来自真实 Rust crate(经 WASM 或 WS),而非 JS 重实现。
- 见证级可复现:相同
(scene, config, seed)在不同浏览器、OS、WASM↔WS 通道间产生字节一致的帧流;witness 漂移时仪表盘拒绝将运行标记为“verified”。 - 可离线:首次加载后 WASM 模式可离线运行(PWA service worker)。
- 可嵌入:同时产出 Vite library 构建与静态 SPA。
- 可访问:WCAG 2.2 AA、全键盘导航、
prefers-reduced-motion。 - 移动可用:忠实移植 mockup 的 1180px 与 860px 断点。
2.2 Non-goals(非目标)
- 不是物理 NV 硬件的 fleet 管理 UI——nvsim 只是仿真器,仪表盘只读仿真输出。
- 不是多用户协作工作区(单用户、本地优先)。
- 不是通用绘图库(图表为 nvsim 数据模型定制)。
- 不是云 SaaS(默认无托管后端,WS 通道需用户显式自建 host)。
3. 事实来源:mockup 的完整功能清单
mockup 的布局网格与组件清单是实现的“契约”。布局如下:
┌─────┬──────────────────────────────────────────────┐
│ │ topbar (48px) │
│ rail├──────────┬─────────────────┬─────────────────┤
│ 56px│ sidebar │ scene (SVG) │ inspector │
│ │ 280px │ 1fr │ 340px │
│ │ ├─────────────────┤ │
│ │ │ console 220px │ │
└─────┴──────────┴─────────────────┴─────────────────┘
响应式策略:1180px 折叠 sidebar,860px 折叠 inspector + rail,改用汉堡菜单。
3.1 组件清单(在 dashboard/src/components/ 中逐项落地)
ADR 以表格完整枚举了每个 Zone 的组件与其 mockup 引用,实现目录在仓库中一一对应(dashboard/src/components):
| Zone | 组件 | 当前仓库中的实现文件 |
|---|---|---|
| Rail | Logo(线性渐变 amber)、5 个导航按钮、设置按钮 | nv-rail.ts |
| Topbar | 面包屑(点击改名)、FPS pill、WASM/WS 状态 pill、Seed pill、主题切换、Reset/Run | nv-topbar.ts |
| Sidebar | 场景面板(4 类源、拖拽排序)、NV 传感器面板(COTS 默认值)、Tunables 滑杆(fs/fmod/dt/noise)、6 阶段流水线图 | nv-sidebar.ts |
| Scene | SVG 画布、可拖拽源(rebar/heart/mains/eddy)、3D 倾斜旋转晶体的 NV 传感器、场线动画、mini ODMR 覆盖层、4 张状态卡、仿真控制(step/play/step/speed)、工具栏 | nv-scene.ts |
| Inspector | Signal / Frame / Witness 三个标签页 | nv-inspector.ts |
| Console | 5 个过滤标签、日志流(虚拟滚动、上限 200)、REPL 输入、Pause/Clear | nv-console.ts |
| Settings drawer | 主题、密度(comfy/default/compact)、动效、自动更新 | nv-settings-drawer.ts |
| 模态框 | New scene / Export proof / Reset confirm / Shortcuts / About | nv-modal.ts |
| Cmd palette | ⌘K 命令面板(约 17 条命令,全模糊搜索) | nv-palette.ts |
| Debug HUD | ` 可切换:渲染 fps、帧 dt、sim t、DOM 节点、堆、fps 图 |
nv-debug-hud.ts |
| 引导/Toast | 欢迎导览、1.8s 自动消失通知 | nv-onboarding.ts、nv-toast.ts |
实现侧还额外演化出 nv-app.ts、nv-home.ts、nv-help.ts、nv-ghost-murmur.ts 与 nv-app-store.ts 等组件,详见 §9 的 App Store 一节。
3.2 REPL 指令集(必须与 mockup 1:1)
help — 列出命令
scene.list — 描述已加载场景
sensor.config — 打印 NvSensor::cots_defaults()
run — 启动流水线
pause — 暂停流水线
resume — run 的别名
seed [hex] — 读取/设置 RNG seed
proof.verify — 重推导 witness,并与期望值比较
proof.export — 写出 proof bundle
clear — 清空控制台
theme [light|dark] — 切换主题
3.3 键盘快捷键(必须 1:1)
| 键 | 动作 |
|---|---|
| ⌘K / Ctrl K | 命令面板 |
| Space | 播放/暂停 |
| ⌘R / Ctrl R | 重置(带确认) |
| ⌘, / Ctrl , | 设置 |
| ⌘N / Ctrl N | 新建场景 |
| ⌘E / Ctrl E | 导出 proof |
| ⌘/ / Ctrl / | 切换主题 |
` |
切换 Debug HUD |
| 1 / 2 / 3 | Inspector 标签切换 |
| Esc | 关闭模态/面板 |
| / | 聚焦 REPL |
4. 双通道架构与共享客户端接口
整体架构(静态 SPA + 可选自建 server):
GitHub Pages — 静态 SPA
Vite SPA bundle
UI components (Lit) ◄──► appStore (signals)
▲ ▼
IndexedDB kv NvsimClient 接口
(settings, scenes, ├─ WasmClient (默认) → Web Worker → nvsim.wasm
witnesses) └─ WsClient (可选) → REST + WebSocket
│ (opt-in, 用户自建)
nvsim-server (Axum, v2/crates/nvsim-server/)
REST: /scene /config /witness /export-proof
WS : /stream ─ MagFrame 二进制订阅
4.1 为什么需要两条通道
- 默认 WASM:适合演示用例——打开 GitHub Pages 链接即可,无安装无服务器,确定性契约天然可审计:
.wasm二进制正是仪表盘 pin 住 SHA-256 的那个产物。 - WS:适合研究生产工作流——10⁶+ 帧长场景、与原生构建对比运行、录制数据回放、与 RuView mesh 其余部分集成。同一 UI,仅替换
NvsimClient实现,用户在设置中输入ws://URL 即启用。
4.2 共享接口定义
NvsimClient 接口同时包含控制面(scene/config/seed/reset/run/pause/step)与数据面(帧流、事件流),以及 witness 三件套(generateWitness / verifyWitness / exportProofBundle):
// dashboard/src/transport/NvsimClient.ts
export interface NvsimClient {
// 控制面(WS 模式走 REST,WASM 模式走 postMessage)
loadScene(scene: SceneJson): Promise<void>;
setConfig(cfg: PipelineConfigJson): Promise<void>;
setSeed(seed: bigint): Promise<void>;
reset(): Promise<void>;
run(opts?: RunOpts): Promise<void>;
pause(): Promise<void>;
step(direction: 'fwd' | 'back', dtMs: number): Promise<void>;
// 数据面(WS 订阅 / SharedArrayBuffer ring)
onFrames(cb: (batch: MagFrameBatch) => void): void;
onEvent(cb: (ev: NvsimEvent) => void): void;
// Witness
generateWitness(samples: number): Promise<Uint8Array>;
verifyWitness(expected: Uint8Array): Promise<{ ok: true } | { ok: false; actual: Uint8Array }>;
exportProofBundle(): Promise<Blob>;
runTransient(scene, config, seed, samples): Promise<TransientRunResult>;
buildId(): Promise<string>;
close(): Promise<void>;
}
真实代码与 ADR 中草案略有演进:数据面改为回调注册(onFrames/onEvent),并新增 runTransient(单次“对某场景传感器能恢复什么”查询,不打扰运行中的流水线)与 buildId(nvsim 版本字符串)。该文件同时给出 60 字节 MagFrame v1 的小端布局解析器 parseMagFrame/parseFrameBatch,字段为 magic(u32) | version(u16) | flags(u16) | sensor_id(u16) | _reserved(u16) | t_us(u64) | b_pt3 | sigma_pt3 | noise_floor_pt_sqrt_hz(f32) | temperature_k(f32),并在 Rust 侧用 frameMagic()/frameBytes() 静态导出供前端校验游标推进——TS 与 Rust 对帧布局“互为镜像”。
5. Rust 侧工作:两个 crate 的落地证据
5.1 nvsim 的 WASM 绑定(现成源码可查)
本 ADR 要求在现有 nvsim crate 中以新增 wasm feature flag 的方式添加 wasm-bindgen 绑定,保持 no_std 姿态。仓库中的实际实现位于 v2/crates/nvsim/src/wasm.rs,通过 #![cfg(all(feature = "wasm", target_arch = "wasm32"))] 门控,暴露:
WasmPipeline::new(scene_json, config_json, seed)—— seed 以f64传入(wasm-bindgen 尚不能优雅传u64),再位转换为u64,仪表盘以 32-bit 值经Number(seed_hex)发送;run(n)—— 返回拼接的MagFrame原始字节(每帧 60 字节);runWithWitness(n)—— 一次调用返回{ frames, witness, frameCount };buildVersion()/frameMagic()/frameBytes()—— 供启动时握手与帧解析游标推进;referenceSceneJson()/referenceWitness()/expectedReferenceWitnessHex()—— 参考场景与期望 witness 的 Rust 侧单一来源;runTransient(...)—— Ghost Murmur 交互式 demo 使用的一次性运行。
该文件还内嵌了期望 witness 常量 cc8de9b01b0ff5bd97a6c17848a3f156c174ea7589d0888164a441584ec593b4,即“参考场景 @ seed=42、N=256”的确定性 SHA-256(与 v2/crates/nvsim/src/proof.rs 中 Proof::EXPECTED_WITNESS_HEX / PUBLISHED_WITNESS_HEX 完全一致)。nvsim 之所以能干净编译到 wasm32,是因为 crate 源码中零 std::time/std::fs/std::env/std::process/std::thread/Mutex/RwLock 调用,散粒噪声 PRNG 由调用方传入的 u64 seed 驱动,无需 OS 熵桥接(详见 v2/crates/nvsim/README.md 的 “WebAssembly” 一节)。
5.2 nvsim-server:Axum 二进制(路由表全部实现)
ADR 规划的新 crate 位于 v2/crates/nvsim-server/,其 src/main.rs 已实现全部路由(REST 控制面 + 二进制 WebSocket 数据面):
| Method | Path | Purpose |
|---|---|---|
| GET | /api/health |
存活 + nvsim 版本 + magic + 期望 witness |
| GET/PUT | /api/scene |
读取/替换当前场景 |
| GET/PUT | /api/config |
读取/替换 PipelineConfig |
| GET/PUT | /api/seed |
读取/设置 seed(hex) |
| POST | /api/run /api/pause /api/reset /api/step |
运行态控制 |
| POST | /api/witness/generate |
跑 N 帧并返回 SHA-256 |
| POST | /api/witness/verify |
重推导并与期望比对 |
| POST | /api/witness/reference |
跑规范 Proof::generate |
| POST | /api/export-proof |
导出 proof bundle(JSON) |
| GET | /ws/stream |
WebSocket 二进制 MagFrame 流 |
命令行参数仅有 --listen(默认 127.0.0.1:7878)与 --allowed-origin(默认 *,生产可配 allowlist);CORS 层据此构造。/ws/stream 每 16ms tick 推送 32 帧一批的二进制消息,每客户端独立构建一个 Pipeline(仿真足够快,无需多路复用)。/api/witness/verify 的语义值得注意:永远针对规范参考场景执行(Proof::generate),用户工作区场景不参与校验,从而与 Proof::EXPECTED_WITNESS_HEX 保持一致。
服务器默认讲明文 HTTP/WS,TLS 由前置 Caddy/nginx 提供(BYO-TLS),符合 ADR 中“V1 面向局域网、不做鉴权”的边界。
6. 前端技术栈与数据流
6.1 技术选型(package.json 佐证)
dashboard/package.json 的实际依赖验证了 ADR 的决策:
- Vite 5 + TypeScript 5.x 严格模式;
- Lit 3(
lit@^3.2.1)custom elements + 响应式属性,运行期约 10 KB,契合体积预算; @preact/signals-core@^1.8.0—— 单一appStore的信号库;- 无 CSS 框架:mockup 手写 CSS(
oklch调色板 + CSS 变量主题)原样移植进 app.css; - Vitest 单元测试、Playwright E2E(dashboard↔WASM 与 dashboard↔WS)、
vite-plugin-pwa+workbox-window离线支持; - scripts 含
dev/build/typecheck/test/test:e2e/test:a11y,其中test:a11y专项跑 axe-core(tests/a11y.spec.ts)。
6.2 状态模型
单一 appStore(dashboard/src/store/appStore.ts)暴露 signals:transport('wasm' | 'ws')、connected、running、paused、t(仿真时间)、framesEmitted(bigint)、scene、config、seed、theme、density(comfy/default/compact)、motionReduced、witness、lastB(三维 T 值)、snr。持久化层 persistence.ts 负责 IndexedDB kv(设置、场景、witness、app 激活状态)。
6.3 WASM 模式数据流(默认通道)
User action → component → appStore signal
→ WasmClient.run({ frames: N })
→ postMessage → Web Worker
→ nvsim.WasmPipeline.run(N) → Vec<u8>
→ postMessage(transfer) → 主线程
→ parse → MagFrame[] → appStore.lastB/.witness/…
→ 组件重渲染
worker.ts 是这一链路的关键实现:启动时以 BASE_URL(开发为 /,GitHub Pages 下为 /RuView/nvsim/)动态 import wasm 包并握手 booted(上报 buildVersion/frameMagic/frameBytes/expectedWitnessHex);运行期每 16ms tick 在 Worker 内模拟 32 帧,以 ArrayBuffer transfer 而非拷贝的方式回传批次;witnessVerify 分支永远以 referenceWitness()(seed=42、N=256 的规范运行)比对期望字节。由于 GitHub Pages 目前不提供 COOP/COEP 头,SharedArrayBuffer ring 在 Pages 上不可用,代码走 postMessage(transfer) 回退路径——与 ADR §7.4 的风险预案一致。
6.4 WS 模式数据流(可选通道)
用户在 Settings 输入 ws://192.168.50.50:7878 → WsClient 替换 appStore 中的实现 → REST 握手 → WebSocket 建立 → 服务器按自选速率推送帧批次 → 同一套解析器、同一批组件。Topbar 状态 pill 从 wasm(青色)切换为 ws(品红)并显示 host,连接断开则变红。
6.5 Witness 验证与确定性断言
两种模式都暴露 generateWitness(N) / verifyWitness(expected)。Inspector 的 Witness 面板 “Verify” 按钮以 seed=42 调用 generateWitness(256),与内置的 cc8de9b01b0ff5bd… 比较——通过显示绿色 ✓ + hash,失败显示实际 hash 与审计提示。ADR 强调:这相当于把 cargo test -p nvsim 中的同一回归测试搬到浏览器里、对着用户自己构建的 WASM 跑一遍。这一点有测试端到端佐证:v2/crates/nvsim/src/proof.rs 的测试套件包含参考场景解析、跨运行字节一致、换 seed 则 witness 变化、以及 pin 死已发布 witness 的回归断言。
7. 图表层与调试设施
图表为三套自研 SVG 渲染器(不用 Canvas/WebGL/图表库,mockup 即 inline SVG),各成模块:odmr(Lorentzian 谷线复合、4 轴分裂、FWHM 徽章、拟合叠加)、b-trace(200 样本环形缓冲三通道折线)、frame-strip(48 柱 sparkline)。三者均在 requestAnimationFrame 内合并重渲染,且全部尊重 motionReduced(prefers-reduced-motion 下无动画)。
8. 构建与部署
8.1 CI 工作流(push 触发 → wasm-pack → Vite → GitHub Pages)
name: Dashboard → GitHub Pages
on:
push:
branches: [main]
paths: ['v2/crates/nvsim/**', 'dashboard/**']
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with: { targets: wasm32-unknown-unknown }
- run: cargo install wasm-pack --version 0.13.x
- run: wasm-pack build v2/crates/nvsim --target web --release --features wasm
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm, cache-dependency-path: dashboard/package-lock.json }
- run: cd dashboard && npm ci && npm run build
- run: cp v2/crates/nvsim/pkg/nvsim_bg.wasm dashboard/dist/nvsim.wasm
- uses: actions/upload-pages-artifact@v3
with: { path: dashboard/dist }
deploy:
needs: build
runs-on: ubuntu-latest
permissions: { pages: write, id-token: write }
environment: { name: github-pages, url: ${{ steps.deployment.outputs.page_url }} }
steps:
- id: deployment
uses: actions/deploy-pages@v4
8.2 GitHub Pages、PWA 与 server 分发要点
- Pages 源为
gh-pages分支(actions/deploy-pages自动维护),HTTPS 默认强制,SPA 路由需 404 回退到/index.html;子路径部署时 manifest scope 为/RuView/nvsim/,service worker 需按此声明(ADR 开放问题 #1,Pass 6 解决)。 - PWA:
vite-plugin-pwa+ workbox,预缓存 WASM、字体与应用外壳;SW 版本与 nvsim 版本绑定,新版本强制刷新。 nvsim-server由现有release.yml逐 target 构建 Cargo 二进制,并提供 Dockerfile(v2/crates/nvsim-server/Dockerfile);V1 不做 Helm chart。
9. 实现阶段规划与验收标准
9.1 六个 Pass(镜像 nvsim 自身的六 Pass 计划)
| Pass | 范围 | 估时 |
|---|---|---|
| 1 | Vite+TS+Lit 脚手架、四区网格、IndexedDB 管道、CI <500KB gzip | 1–2 天 |
| 2 | wasm feature、wasm-bindgen 包装、Web Worker + WasmClient、256 帧冒烟 |
2–3 天 |
| 3 | §4.2 全部 12 类库存组件、三套图表、主题/密度、抽屉/模态/toast、视觉回归 ≤2% | 4–5 天 |
| 4 | 控制台 + REPL + ⌘K 面板 + 全部快捷键 + Debug HUD | 2–3 天 |
| 5 | nvsim-server crate、全部路由、WsClient、模式切换 UI、跨通道 witness 一致性 |
3–4 天 |
| 6 | WCAG 审计、键盘导航、ARIA、prefers-reduced-motion、引导、PWA、Pages 工作流、发布 v0.6.0-dashboard |
2–3 天 |
合计 14–20 个工作日(单人,Pass 3 可并行拆交)。当前仓库中 dashboard 目录、v2/crates/nvsim/src/wasm.rs 与 v2/crates/nvsim-server 均已存在,说明 Pass 1–5 的主体代码已落地。
9.2 验收门(ADR 记录为 8 ✅ / 4 ⚠)
| # | Gate | 状态与证据 |
|---|---|---|
| 11.1 | 对 mockup 忠实度 ≤2% 回归 | ✅ 12 个 zone 全部上线 |
| 11.2 | 确定性——witness 字节一致 | ✅ WASM;⏳ WS(需部署 nvsim-server 在第三方 host 验证)。两端均产出 cc8de9b01b0ff5bd… |
| 11.3 | 吞吐 ≥1 kHz | ✅ Chromium WASM 实测约 1.79 kHz |
| 11.4 | Bundle ≤300 KB / WASM ≤1 MB | ✅ JS gzip 约 140 KB、WASM 162 KB |
| 11.5 | A11y(axe-core 0 critical/serious) | ⚠ 手工补齐 skip link、role=log/tablist、focus trap,正式扫描待做 |
| 11.6 | 纯键盘操作 | ⚠ 部分流程尚未 Tab-only 验证 |
| 11.7 | 离线 PWA | ✅ scope /RuView/nvsim/、16 条 precache、workbox autoUpdate |
| 11.8 | 跨浏览器 | ⚠ Chromium 已测,FF/Safari 待 post-merge |
| 11.9 | REPL 对齐 | ✅ §4.3 全部指令实现 |
| 11.10 | 快捷键对齐 | ✅ §4.4 全部和弦实现 |
| 11.11 | Witness UI | ✅ 绿 ✓/红 ✗ 验证面板 + 4 张参考场景元数据卡 |
| 11.12 | 模式切换确定性 | ⚠ WsClient 已上线、切换时自动重验,字节级等价待 server 部署 |
4 个 ⚠ 项均依赖外部基础设施或审计签字,无一被仪表盘代码本身阻塞。
10. 补充扩展:App Store(实现期新增,非 mockup 原型)
实现过程中新增了 App Store 视图(入口见 dashboard/src/store/apps.ts),将 wifi-densepose-wasm-edge(ADR-040 Tier 3 热加载算法)中的每个 WASM 边缘模块连同 nvsim 本身编目。原因:RuView 已内置 60+ 专用边缘算法,缺少 operator 面则它们只存在于源码中;App Store 让它们在不重编译固件的前提下可发现、可开关。
编目规模:模拟器 1 个 + Medical/Health(6) + Security(5) + Smart Building(5) + Retail(5) + Industrial(5) + Signal Processing(7) + Online Learning(4) + Spatial/Graph(3) + Temporal/Planning(3) + AI Safety(3) + Quantum(2) + Autonomy/Mesh(2) + Exotic/Research(11) = 66 项。
每个条目携带 id(kebab-case,与 wasm-edge 模块名一致,即 ESP32 固件 WASM3 加载的导出)、name、category、crate、summary、events、budget(S <5ms / M <15ms / L <50ms)、status(available/beta/research)、adr、tags。UI 为 280px 自适应卡片网格 + 跨 id/name/summary/tags 的模糊搜索 + 分类/成熟度双过滤 + 每卡开关(经 IndexedDB app-activations 持久化,激活卡片显示翠绿描边)。
激活语义分两档:**WASM 通道(默认)**下激活纯客户端,仅驱动 Console 事件日志,让用户先感知“fleet 上会跑什么”;**WS 通道(V2)**则通过 app.activate(id, true|false) RPC 经 nvsim-server 转发到 ESP32 mesh,指示 WASM3 host 加载/卸载模块。新增一个 app 的流程为:在 wifi-densepose-wasm-edge/src/<id>.rs 实现 → 注册进 lib.rs → 在 apps.ts 的 APPS 增加条目 → 提升 dashboard 版本由 CI 发布。ADR 还预留了“每个 wasm-edge 模块都必须有 apps.ts 条目”的 lint 检查。
11. 备选方案回顾与风险应对
被否决的方案及其理由构成理解该架构的重要上下文:
- React/Next.js:mockup 是原生 DOM,Lit 运行期更小,React+Next 会撑破 300 KB 预算;
- Tauri 桌面:V1 用户明确要 Vite + GitHub Pages,Tauri 可在后续作为同一 Vite 构建的薄壳;
- 纯服务器(无 WASM):会破坏 GitHub Pages 的“秒开 demo”路径;
- 用 JS 重写仿真器:被坚决否决——这会让确定性契约荡然无存;
- WebGL/Canvas 图表:SVG 与 mockup 一致、可被读屏器读取,且每图 ≤200 样本的数据量对 SVG 微不足道;
- 单一客户端不抽象:共享
NvsimClient接口正是 WASM/WS 零成本切换与第三方@ruvnet/nvsim-client包成立的前提。
主要风险与预案(节选):WASM 移动端 <1kHz(Pass 2 早期基准 + 移动 UA 降采样兜底);wasm-bindgen ABI 漂移破坏 witness(版本 pin + CI 每 PR 重推导);GitHub Pages 无 COOP/COEP 导致 SAB 不可用(不依赖 SAB,postMessage transfer 对 256 帧批次足够快);体积膨胀(CI size-limit 强约束 300 KB);SW 更新停滞(clients.claim() + 版本 pin 缓存键);nvsim-server 的出口管制审查(nvsim 纯磁测、雷达层已在 ADR-091 明确出界);隐私(默认 WASM 本地化,WS 需显式选择自建 host)。
12. 延伸阅读(同一链路的相关文档)
- ADR-089-nvsim-nv-diamond-simulator.md —— 本仪表盘所驱动的后端仿真器本体;
- ADR-090-nvsim-lindblad-extension.md —— Lindblad 扩展,上线后将作为 Tunables 面板的功能开关;
- ADR-091-stand-off-radar-tier-research.md —— 正交的雷达研究层;
- docs/research/quantum-sensing/15-nvsim-implementation-plan.md —— 六 Pass 实现计划模型;
- docs/research/quantum-sensing/16-ghost-murmur-ruview-spec.md —— 用例叙事(Ghost Murmur 交互式 demo 由此派生);
- assets/NVsim Dashboard.zip —— 规范 UI mockup(单文件 HTML,约 4200 行)。
一句话总结:nvsim Dashboard 的价值不在于“又一个可视化前端”,而在于把 Rust 仿真器的确定性 witness 契约原封不动地搬到浏览器——WASM 默认路径让任何人都能零安装复现同一串 cc8de9b01b0ff5bd…,WS 可选路径则把同一契约扩展到研究级长场景与自建集群;共享的 NvsimClient 接口是这一切可互换性的支点。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0625
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00