首页
/ nvsim Dashboard 架构落地指南:Vite + 双通道(WASM + REST/WebSocket)如何把确定性 NV 金刚石磁力计仿真器搬进浏览器

nvsim Dashboard 架构落地指南:Vite + 双通道(WASM + REST/WebSocket)如何把确定性 NV 金刚石磁力计仿真器搬进浏览器

2026-09-07 10:20:45作者:沈韬淼Beryl

本文依据 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(目标)

  • 忠实还原 mockupNVSim 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.tsnv-toast.ts

实现侧还额外演化出 nv-app.tsnv-home.tsnv-help.tsnv-ghost-murmur.tsnv-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.rsProof::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 3lit@^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 状态模型

单一 appStoredashboard/src/store/appStore.ts)暴露 signals:transport('wasm' | 'ws')、connectedrunningpausedt(仿真时间)、framesEmitted(bigint)、sceneconfigseedthemedensity(comfy/default/compact)、motionReducedwitnesslastB(三维 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:7878WsClient 替换 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 内合并重渲染,且全部尊重 motionReducedprefers-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.rsv2/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 加载的导出)、namecategorycratesummaryeventsbudget(S <5ms / M <15ms / L <50ms)、status(available/beta/research)、adrtags。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.tsAPPS 增加条目 → 提升 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. 延伸阅读(同一链路的相关文档)

一句话总结:nvsim Dashboard 的价值不在于“又一个可视化前端”,而在于把 Rust 仿真器的确定性 witness 契约原封不动地搬到浏览器——WASM 默认路径让任何人都能零安装复现同一串 cc8de9b01b0ff5bd…,WS 可选路径则把同一契约扩展到研究级长场景与自建集群;共享的 NvsimClient 接口是这一切可互换性的支点。

登录后查看全文
热门项目推荐
相关项目推荐