一键导入
verify
How to end-to-end verify claude-usage-dashboard changes — isolated server instance, fixture injection without touching real logs, Playwright checks
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
How to end-to-end verify claude-usage-dashboard changes — isolated server instance, fixture injection without touching real logs, Playwright checks
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | verify |
| description | How to end-to-end verify claude-usage-dashboard changes — isolated server instance, fixture injection without touching real logs, Playwright checks |
The sandbox blocks in-process listeners — start the server detached via
Start-Process. Port 3000 is often inside a Windows excluded port range;
8080 is known-safe. An explicit PORT fails fast instead of falling back.
$env:PORT = "8080"
$env:CLAUDE_DASH_SYNC_DIR = "<scratch>\sync-verify" # see fixture injection below
$env:CLAUDE_DASH_MACHINE_NAME = "verify-local"
Start-Process -FilePath node -ArgumentList "server/index.js" `
-WorkingDirectory <repo> -WindowStyle Hidden `
-RedirectStandardOutput "<scratch>\server-out.log" -RedirectStandardError "<scratch>\server-err.log" -PassThru
Poll server-out.log for running at (startup sync of real logs takes up to
~60s the first time). Kill by PID and delete the temp sync dir when done.
LOG_DIR is hardcoded to ~/.claude/projects, but when CLAUDE_DASH_SYNC_DIR
is set the server reads from that dir instead (multi-machine layout:
<syncDir>/<machine>/<project-dir>/<session>.jsonl). So:
CLAUDE_DASH_SYNC_DIR at a temp dir — startup sync copies real logs
into <temp>/verify-local/ (real data appears in the UI for free).<temp>/synthetic-box/-Users-test-Workspace-myfixture/sess.jsonl.Minimal parseable record (one JSONL line):
{"type":"assistant","sessionId":"s1","timestamp":"2026-07-05T08:00:00.000Z","message":{"id":"msg_1","model":"claude-sonnet-5","usage":{"input_tokens":500000,"output_tokens":200000,"cache_read_input_tokens":1000000,"cache_creation_input_tokens":400000}}}
Records are deduped by message.id (largest output_tokens wins) — give each
synthetic record a distinct id.
change event./— \d+.?\d*%$/; slice colors are
svg path[fill]; session-table model tags are .tag[class*="tag-model-"].fetch('/api/cost?from=...&to=...&model=<id>') → api_equivalent_cost_usd.