@glassmkr/crucible 0.13.2 → 0.13.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,25 +3,29 @@
3
3
  [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
4
  [![npm version](https://img.shields.io/npm/v/@glassmkr/crucible.svg)](https://www.npmjs.com/package/@glassmkr/crucible)
5
5
 
6
- <!-- Canonical rule count: see RULES_COUNT.md in the Glassmkr monorepo. -->
7
- Lightweight bare metal server monitoring agent. Collects hardware and OS health every 5 minutes and pushes snapshots to the [Glassmkr Dashboard](https://app.glassmkr.com), which evaluates 38 alert rules and sends notifications.
6
+ <!-- Canonical rule count: 61 across 9 categories. -->
7
+ Lightweight bare-metal server monitoring agent. Collects hardware and OS health every 60 seconds at the default interval and pushes snapshots to the [Glassmkr Dashboard](https://app.glassmkr.com), which evaluates 61 alert rules across 9 categories and sends notifications.
8
8
 
9
- Open source. MIT licensed. Built by [Glassmkr](https://glassmkr.com). See also the [Bench MCP packages](https://glassmkr.com/docs/mcp) (`@glassmkr/bench-*` on npm) for AI-tool access to your Glassmkr fleet.
9
+ Open source. MIT licensed. Built by [Glassmkr](https://glassmkr.com). Crucible is the open-source product; the optional [Glassmkr Dashboard](https://app.glassmkr.com) is a hosted SaaS that consumes Crucible's snapshots.
10
10
 
11
- **Resource usage:** ~90MB RSS memory (varies by hardware: servers with more IPMI sensors use more), <0.1% CPU at 5-minute collection interval. Collects IPMI, SMART, ZFS, network bonds, security posture, conntrack, systemd, NTP, and file descriptors.
11
+ **Resource usage:** median ~91 MB RSS at idle (validation-fleet measurement 2026-05-21 across 7 hosts, 3 vendors, 4 OS families; range 65 to 103 MB peak; varies primarily with disk count and IPMI sensor count). Effectively 0% CPU at the default 60-second snapshot interval. Random-read I/O throughput delta under 1.5% under fio saturation (no measurable impact on customer workloads). The full measurement campaign lives at [`docs/measurements/2026-05-19/`](docs/measurements/2026-05-19/).
12
12
 
13
- **Security:** See [glassmkr.com/security](https://glassmkr.com/security) for the full list of what Crucible does and does not collect.
13
+ **Security:** See [glassmkr.com/trust](https://glassmkr.com/trust) for the full list of what Crucible does and does not collect.
14
14
 
15
15
  ## Screenshots
16
16
 
17
- ![Dashboard alerts with fix commands](https://glassmkr.com/screenshots/alerts.png)
18
- *Alerts grouped by server, with AI-generated fix commands for each rule.*
17
+ ![Dashboard alert with copy-pasteable fix commands](https://glassmkr.com/screenshots/alerts.png)
18
+ *A P1 alert showing the rule trigger, evidence, and the exact remediation
19
+ commands. Each rule ships pre-written fix content; the agent does not write
20
+ to your server.*
19
21
 
20
- ![Storage, SMART health, and network bonds](https://glassmkr.com/screenshots/hardware.png)
21
- *Per-disk SMART status, storage capacity, and network interface bonding.*
22
+ ![Storage and SMART drive health](https://glassmkr.com/screenshots/hardware.png)
23
+ *Per-mount capacity and per-disk SMART status. Drives are checked against
24
+ SMART attributes, NVMe Critical Warning bits, and ZFS pool state.*
22
25
 
23
- ![Security posture and server overview](https://glassmkr.com/screenshots/overview.png)
24
- *Security posture, server overview, and active alerts.*
26
+ ![Server fleet overview](https://glassmkr.com/screenshots/overview.png)
27
+ *Fleet view with per-server status, distro, IP, and last-seen timestamp.
28
+ Alerted servers surface a counter at a glance.*
25
29
 
26
30
  ## Install
27
31
 
@@ -56,7 +60,7 @@ sudo mkdir -p /etc/glassmkr
56
60
  sudo tee /etc/glassmkr/collector.yaml << 'EOF'
57
61
  server_name: "web-01"
58
62
  collection:
59
- interval_seconds: 300
63
+ interval_seconds: 60
60
64
  ipmi: true
61
65
  smart: true
62
66
  dashboard:
@@ -73,7 +77,7 @@ docker compose up -d
73
77
  docker compose logs -f crucible
74
78
  ```
75
79
 
76
- Images are published to [ghcr.io/glassmkr/crucible](https://github.com/glassmkr/crucible/pkgs/container/crucible) on every tag release. The container needs `--privileged` and `network_mode: host` for IPMI, SMART, and accurate host network monitoring. Details in the [compose file](./docker-compose.yml).
80
+ Images are published to both [`ghcr.io/glassmkr/crucible`](https://github.com/glassmkr/crucible/pkgs/container/crucible) and [`docker.io/glassmkr/crucible`](https://hub.docker.com/r/glassmkr/crucible) on every tag release; either works. The container needs `--privileged` and `network_mode: host` for IPMI, SMART, and accurate host network monitoring. Details in the [compose file](./docker-compose.yml).
77
81
 
78
82
  ## Quick Start
79
83
 
@@ -120,7 +124,7 @@ Options:
120
124
  ```yaml
121
125
  server_name: "web-01"
122
126
  collection:
123
- interval_seconds: 300
127
+ interval_seconds: 60
124
128
  ipmi: true
125
129
  smart: true
126
130
  dashboard:
@@ -153,7 +157,7 @@ dashboard:
153
157
  api_key: "gmk_cru_live_..."
154
158
  ```
155
159
 
156
- The `api_key` value itself is unchanged only the parent key
160
+ The `api_key` value itself is unchanged; only the parent key
157
161
  (`forge:` → `dashboard:`) and the endpoint hostname need updating.
158
162
  After the edit, restart the service:
159
163
 
@@ -246,22 +250,26 @@ this detection automatically; the manual flow above is just the equivalent.
246
250
  | Module | Data |
247
251
  |--------|------|
248
252
  | CPU | Aggregate and per-core utilization (user, system, iowait, idle) |
249
- | Memory | RAM usage, swap usage |
250
- | Disks | Space per mount point, inode counts, mount options, filesystem type |
251
- | SMART | Drive health, model, temperature, power-on hours, reallocated sectors, NVMe wear |
252
- | Network | Interface traffic, delta error/drop counters, link speed |
253
- | RAID | mdadm array status, degraded detection |
254
- | IPMI | Sensor readings, ECC errors, SEL events, fan RPM |
255
- | Security | SSH config, firewall status, pending updates, kernel vulnerabilities, kernel-needs-reboot |
256
- | ZFS | Pool state, scrub age, scrub errors |
257
- | I/O | Per-device latency, IOPS, dmesg I/O errors |
258
- | Conntrack | nf_conntrack table usage |
259
- | Systemd | Failed unit count |
253
+ | Memory | RAM usage, swap usage, EDAC counters, vmstat pswpin/pswpout |
254
+ | Pressure (PSI) | cpu / io / memory `some` and `full` stall avg + total (kernel >= 4.20) |
255
+ | Disks | Space per mount point, inode counts, mount options, filesystem type, LVM thin metadata |
256
+ | SMART | Drive health, model, temperature, power-on hours, reallocated sectors, NVMe wear, NVMe Critical Warning decode |
257
+ | Network | Interface traffic, delta error/drop counters, link speed, ethtool advertised modes, softnet per-CPU drops |
258
+ | RAID | mdadm array status, degraded detection; hardware RAID via storcli/perccli (fleet-tested), ssacli/arcconf (stub) |
259
+ | IPMI | Sensor readings, ECC errors, SEL events, fan RPM, PSU redundancy state; vendor SEL parsers (Dell/Supermicro/HPE fleet-tested, Lenovo/Cisco/OpenBMC stub) |
260
+ | Security | SSH config, firewall status, pending updates, kernel vulnerabilities, kernel-needs-reboot, CVE collection |
261
+ | ZFS | Pool state, vdev redundancy class, SLOG/L2ARC split, scrub age, scrub errors |
262
+ | GPU (NVIDIA) | nvidia-smi tier 1 (default), DCGM tier 2 (enrichment), Redfish OEM tier 3 (stub); per-GPU XID events, temperature, ECC, power draw, PCIe link state |
263
+ | I/O | Per-device latency, IOPS, dmesg I/O errors, structured dmesg events |
264
+ | Conntrack | nf_conntrack table usage, insert_failed rate |
265
+ | Network process | Per-process FD scan, LACP partner state, TCP retrans rate |
266
+ | Systemd | Failed unit count, Result codes (oom-kill, watchdog, signal) |
260
267
  | NTP | Sync state and source |
261
268
  | File descriptors | System-wide allocation |
269
+ | Reboot evidence | pstore / kdump / wtmp; expected-vs-unexpected reboot classification |
262
270
 
263
- <!-- Canonical rule count: see RULES_COUNT.md in the Glassmkr monorepo. -->
264
- Dashboard evaluates 38 alert rules server-side across OS, Storage, Network, Hardware, ZFS, Security, and Service Health, with priorities P1 Urgent through P4 Low. Full list: [app.glassmkr.com/docs/alerts](https://app.glassmkr.com/docs/alerts).
271
+ <!-- Canonical rule count: 61 across 9 categories. -->
272
+ Dashboard evaluates 61 alert rules server-side across 9 categories (storage, zfs, filesystem, memory & CPU, network, hardware/BMC, time & services, security & patching, GPU), with priorities P1 Urgent through P4 Low. 20 rules ship with deep FIX content (copy-pasteable remediation + verdict prior + rollback notes); 30+ are verified end-to-end on real hardware. Full list: [glassmkr.com/docs/rules](https://glassmkr.com/docs/rules).
265
273
 
266
274
  ## Requirements
267
275
 
@@ -272,11 +280,11 @@ Dashboard evaluates 38 alert rules server-side across OS, Storage, Network, Hard
272
280
 
273
281
  ## Documentation
274
282
 
275
- - [Getting Started](https://app.glassmkr.com/docs/getting-started)
276
- - [Configuration Reference](https://app.glassmkr.com/docs/configuration)
277
- - [Alert Rules (38)](https://app.glassmkr.com/docs/alerts)
278
- - [Troubleshooting](https://app.glassmkr.com/docs/troubleshooting)
279
- - [API Reference](https://app.glassmkr.com/docs/api)
283
+ - [Getting Started](https://glassmkr.com/docs/getting-started)
284
+ - [Configuration Reference](https://glassmkr.com/docs/configuration)
285
+ - [Alert Rules (61)](https://glassmkr.com/docs/rules)
286
+ - [Troubleshooting](https://glassmkr.com/docs/troubleshooting)
287
+ - [API Reference](https://glassmkr.com/docs/api)
280
288
 
281
289
  ## License
282
290
 
@@ -64,5 +64,81 @@ errors: 2 data errors
64
64
  expect(pools.map((p) => p.name)).toEqual(["tank", "data"]);
65
65
  expect(pools[1].state).toBe("FAULTED");
66
66
  });
67
+ // === Regressions from session-9/A.1 surfacing on ZFS 2.2.9 ===
68
+ it("routes the SLOG vdev into slog_vdevs[] (ZFS 2.2 tab-prefixed `logs` header)", () => {
69
+ // Real fixture captured on val-mz62hd 2026-05-21, ZFS 2.2.9 on
70
+ // AlmaLinux 9.6. The `logs` section header is TAB-prefixed with a
71
+ // trailing TAB. Older parser regex `^logs\s*$` never matched, so
72
+ // every SLOG vdev was misrouted into `vdevs[]` with class=stripe.
73
+ const raw = " pool: gmtest\n" +
74
+ " state: ONLINE\n" +
75
+ "config:\n" +
76
+ "\n" +
77
+ "\tNAME STATE READ WRITE CKSUM\n" +
78
+ "\tgmtest ONLINE 0 0 0\n" +
79
+ "\t mirror-0 ONLINE 0 0 0\n" +
80
+ "\t /var/tmp/zfs-test/disk1.img ONLINE 0 0 0\n" +
81
+ "\t /var/tmp/zfs-test/disk2.img ONLINE 0 0 0\n" +
82
+ "\tlogs\t\n" +
83
+ "\t /var/tmp/zfs-test/slog.img ONLINE 0 0 0\n" +
84
+ "\n" +
85
+ "errors: No known data errors\n";
86
+ const [p] = parseZpoolStatus(raw);
87
+ expect(p.vdevs.length).toBe(1);
88
+ expect(p.vdevs[0].name).toBe("mirror-0");
89
+ expect(p.vdevs[0].redundancy_class).toBe("mirror");
90
+ expect(p.slog_vdevs.length).toBe(1);
91
+ expect(p.slog_vdevs[0].name).toBe("/var/tmp/zfs-test/slog.img");
92
+ expect(p.slog_vdevs[0].state).toBe("ONLINE");
93
+ expect(p.slog_vdevs[0].redundancy_class).toBe("stripe");
94
+ });
95
+ it("flags never-scrubbed on fresh pools that omit the `scan:` line (ZFS 2.2)", () => {
96
+ // Real fixture: a freshly-created pool on ZFS 2.2.9 emits NO
97
+ // `scan:` line at all (not even "scan: none requested"). The
98
+ // older parser's `scrub_never_run` only triggered on the explicit
99
+ // "none requested" phrase, so freshly-created pools never fired
100
+ // the zfs_scrub_errors never-scrubbed branch. The fix asserts
101
+ // scrub_never_run on reaching `errors:` without having seen any
102
+ // `scan:` line.
103
+ const raw = " pool: gmtest\n" +
104
+ " state: ONLINE\n" +
105
+ "config:\n" +
106
+ "\n" +
107
+ "\tNAME STATE READ WRITE CKSUM\n" +
108
+ "\tgmtest ONLINE 0 0 0\n" +
109
+ "\n" +
110
+ "errors: No known data errors\n";
111
+ const [p] = parseZpoolStatus(raw);
112
+ expect(p.scrub_never_run).toBe(true);
113
+ expect(p.scrub_errors).toBeUndefined();
114
+ });
115
+ it("does NOT mark scrub_never_run when scrub history is present (regression check on the above)", () => {
116
+ // The complement: a pool with a real scrub history must NOT be
117
+ // flagged as never-scrubbed by the new fresh-pool logic.
118
+ const raw = " pool: tank\n" +
119
+ " state: ONLINE\n" +
120
+ " scan: scrub repaired 0B in 00:01:23 with 0 errors on Wed Jan 15 00:00:00 2026\n" +
121
+ "errors: No known data errors\n";
122
+ const [p] = parseZpoolStatus(raw);
123
+ expect(p.scrub_never_run).toBeUndefined();
124
+ expect(p.scrub_errors).toBe(0);
125
+ expect(p.scrub_repaired).toBe("0B");
126
+ });
127
+ it("section headers tolerate either tab-prefixed or unindented form (forwards-compat)", () => {
128
+ // ZFS 2.0 emitted section headers unindented (`logs\n`); ZFS 2.2
129
+ // uses tab-prefixed (`\tlogs\t\n`). The parser must handle both.
130
+ const oldStyle = " pool: oldzfs\n" +
131
+ " state: ONLINE\n" +
132
+ "config:\n" +
133
+ "\tNAME STATE\n" +
134
+ "\toldzfs ONLINE\n" +
135
+ "\t disk0 ONLINE\n" +
136
+ "logs\n" +
137
+ "\t log0 ONLINE\n" +
138
+ "errors: No known data errors\n";
139
+ const [p] = parseZpoolStatus(oldStyle);
140
+ expect(p.slog_vdevs.length).toBe(1);
141
+ expect(p.slog_vdevs[0].name).toBe("log0");
142
+ });
67
143
  });
68
144
  //# sourceMappingURL=zfs.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zfs.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/zfs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG;;;;;;;;;;CAUf,CAAC;QACE,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,sBAAsB;YACnC,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,GAAG,GAAG;;;;;CAKf,CAAC;QACE,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG;;;;;CAKf,CAAC;QACE,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG;;;;;;;;CAQf,CAAC;QACE,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"zfs.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/zfs.test.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@
20
20
  // hosts without NVIDIA GPUs. The `which nvidia-smi` probe is the
21
21
  // gate; everything else short-circuits.
22
22
  import { existsSync } from "fs";
23
- import { run } from "../lib/exec.js";
23
+ import { run, runDetailed, looksLikeFieldRenameError } from "../lib/exec.js";
24
24
  const NVIDIA_SMI_TIMEOUT_MS = 5000;
25
25
  const DCGM_TIMEOUT_MS = 5000;
26
26
  const PROBE_TIMEOUT_MS = 2000;
@@ -162,9 +162,33 @@ const NVIDIA_SMI_CSV_FIELDS = [
162
162
  "fan.speed",
163
163
  ];
164
164
  async function collectTier1() {
165
- const csvOut = await run("nvidia-smi", [`--query-gpu=${NVIDIA_SMI_CSV_FIELDS.join(",")}`, "--format=csv,noheader,nounits"], NVIDIA_SMI_TIMEOUT_MS);
165
+ // Use runDetailed so we can distinguish "tool not installed" from
166
+ // "tool exited 0 with empty stdout but errored to stderr". The
167
+ // latter is the silent-no-op class that hid the v0.13.0
168
+ // retired_pages.double_bit_ecc typo for ~24h until a real GPU host
169
+ // triggered the trigger campaign.
170
+ const res = await runDetailed("nvidia-smi", [`--query-gpu=${NVIDIA_SMI_CSV_FIELDS.join(",")}`, "--format=csv,noheader,nounits"], NVIDIA_SMI_TIMEOUT_MS);
171
+ if (!res.installed) {
172
+ return { available: false, reason: "nvidia-smi not present (non-NVIDIA host or driver not installed)" };
173
+ }
174
+ if (res.timedOut) {
175
+ return { available: false, reason: "nvidia-smi query timed out" };
176
+ }
177
+ // exit 0 + empty stdout + stderr complains about a field rename is
178
+ // exactly the v0.13.0 / v0.13.2 bug shape. Surface this loudly with
179
+ // a reason that points an operator at the cause.
180
+ if (res.exitCode === 0 &&
181
+ (!res.stdout || res.stdout.trim().length === 0) &&
182
+ looksLikeFieldRenameError(res.stderr)) {
183
+ console.warn(`[gpu] nvidia-smi exited 0 with empty stdout but stderr looks like a field-name rename: ${res.stderr.trim().slice(0, 240)}`);
184
+ return {
185
+ available: false,
186
+ reason: `nvidia-smi exited 0 with empty stdout; stderr suggests a queried field has been renamed by the driver version. stderr=${res.stderr.trim().slice(0, 200)}`,
187
+ };
188
+ }
189
+ const csvOut = res.stdout;
166
190
  if (!csvOut) {
167
- return { available: false, reason: "nvidia-smi query timeout or returned no output" };
191
+ return { available: false, reason: "nvidia-smi query returned no output" };
168
192
  }
169
193
  const gpus = [];
170
194
  for (const line of csvOut.split("\n").map((l) => l.trim()).filter(Boolean)) {
@@ -262,6 +286,12 @@ async function enrichThrottleReasons(gpus) {
262
286
  if (!xmlOut)
263
287
  return;
264
288
  const gpuBlocks = xmlOut.split(/<gpu /).slice(1); // skip the header
289
+ // Positive-affirmation: count GPUs for which we found a recognisable
290
+ // throttle/event-reasons block. If we found NONE on a host that has
291
+ // active GPUs, the most likely cause is another driver-version XML
292
+ // tag rename (same shape as the v0.13.2 fix), and we want a loud
293
+ // warning so the next person sees it without re-running a campaign.
294
+ let matchedGpus = 0;
265
295
  for (let i = 0; i < gpuBlocks.length && i < gpus.length; i++) {
266
296
  const block = gpuBlocks[i];
267
297
  // Driver 535-: <clocks_throttle_reasons>; driver 550+: <clocks_event_reasons>.
@@ -274,6 +304,7 @@ async function enrichThrottleReasons(gpus) {
274
304
  block.match(/<clocks_throttle_reasons>([\s\S]*?)<\/clocks_throttle_reasons>/);
275
305
  if (!reasonsBlock)
276
306
  continue;
307
+ matchedGpus++;
277
308
  const reasons = [];
278
309
  for (const [suffix, label] of [
279
310
  ["gpu_idle", "gpu_idle"],
@@ -300,6 +331,18 @@ async function enrichThrottleReasons(gpus) {
300
331
  reasons.includes("hw_thermal_slowdown") ||
301
332
  reasons.includes("sw_thermal_slowdown");
302
333
  }
334
+ // Silent-regression-class defense: nvidia-smi returned XML with at
335
+ // least one <gpu> block but none had a recognisable throttle/event
336
+ // reasons sub-block. Most likely cause is a third XML rename the
337
+ // matcher doesn't cover; warn so the next investigator sees this
338
+ // without re-running a trigger campaign on a real GPU host.
339
+ if (gpus.length > 0 && matchedGpus === 0 && gpuBlocks.length > 0) {
340
+ console.warn("[gpu] enrichThrottleReasons: nvidia-smi -q -x emitted GPU blocks but none contained " +
341
+ "<clocks_event_reasons> or <clocks_throttle_reasons>. " +
342
+ "Likely a new driver-version XML rename; performance_state_reasons will be empty " +
343
+ "and the dashboard's gpu_power_cap_throttling + gpu_thermal_critical rules cannot fire. " +
344
+ "Inspect the output of `nvidia-smi -q -x | head -40` and extend the matcher in collect/gpu.ts.");
345
+ }
303
346
  }
304
347
  async function collectNvLinkBasic(gpuIndex) {
305
348
  const out = await run("nvidia-smi", ["nvlink", "--status", "-i", String(gpuIndex)], NVIDIA_SMI_TIMEOUT_MS);
@@ -1 +1 @@
1
- {"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/collect/gpu.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,qEAAqE;AACrE,gEAAgE;AAChE,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,qEAAqE;AACrE,uCAAuC;AACvC,qEAAqE;AACrE,mEAAmE;AACnE,+DAA+D;AAC/D,iEAAiE;AACjE,qEAAqE;AACrE,+DAA+D;AAC/D,gEAAgE;AAChE,0DAA0D;AAC1D,EAAE;AACF,mEAAmE;AACnE,iEAAiE;AACjE,wCAAwC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAYrC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,8DAA8D;AAC9D,qEAAqE;AACrE,qEAAqE;AACrE,qCAAqC;AACrC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1C,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACtC,EAAE,EAAE,4CAA4C;IAChD,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CAC7C,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,kEAAkE;YAC1E,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;QACrB,CAAC,CAAC,MAAM,YAAY,EAAE;QACtB,CAAC,CAAE;YACC,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,qDAAqD;SACL,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACtE,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,mEAAmE;IACnE,oEAAoE;IACpE,kBAAkB;IAClB,MAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,qBAAqB,EAAE,IAAI;YAC3B,IAAI,EAAE,KAAK;YACX,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,IAAI;YACxB,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SACxC,CAAC;IACJ,CAAC;IACD,sEAAsE;IACtE,yDAAyD;IACzD,kCAAkC;IAClC,MAAM,SAAS,GAAG,MAAM,GAAG,CACzB,YAAY,EACZ,CAAC,4BAA4B,EAAE,+BAA+B,CAAC,EAC/D,gBAAgB,CACjB,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,qBAAqB,EAAE,IAAI;YAC3B,IAAI,EAAE,KAAK;YACX,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,IAAI;YACxB,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SACxC,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAE9D,oEAAoE;IACpE,sCAAsC;IACtC,MAAM,UAAU,GAAG,MAAM,YAAY,EAAE,CAAC;IACxC,MAAM,eAAe,GAAG,UAAU;QAChC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;QACrD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,eAAe;QAClC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACxG,CAAC,CAAC,IAAI,CAAC;IAET,iEAAiE;IACjE,gEAAgE;IAChE,kEAAkE;IAClE,yCAAyC;IAEzC,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,qBAAqB,EAAE,aAAa;QACpC,IAAI,EAAE,UAAU,IAAI,YAAY,KAAK,IAAI;QACzC,aAAa,EAAE,YAAY;QAC3B,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,IAAI;QACxB,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,kDAAkD;IAClD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC3F,IAAI,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC/E,OAAO,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,qBAAqB,GAAG;IAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe;IACtD,cAAc,EAAE,aAAa;IAC7B,iBAAiB,EAAE,YAAY,EAAE,aAAa;IAC9C,iBAAiB,EAAE,oBAAoB;IACvC,WAAW,EAAE,WAAW,EAAE,YAAY;IACtC,QAAQ;IACR,uBAAuB,EAAE,mBAAmB;IAC5C,yBAAyB,EAAE,qBAAqB;IAChD,kBAAkB;IAClB,qCAAqC,EAAE,sCAAsC;IAC7E,uCAAuC,EAAE,wCAAwC;IACjF,mDAAmD;IACnD,sEAAsE;IACtE,mEAAmE;IACnE,sEAAsE;IACtE,mEAAmE;IACnE,qEAAqE;IACrE,iEAAiE;IACjE,oEAAoE;IACpE,mEAAmE;IACnE,mBAAmB;IACnB,oCAAoC,EAAE,gCAAgC;IACtE,uBAAuB;IACvB,WAAW;CACH,CAAC;AAEX,KAAK,UAAU,YAAY;IACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,YAAY,EACZ,CAAC,eAAe,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,+BAA+B,CAAC,EACnF,qBAAqB,CACtB,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;IACzE,CAAC;IAED,4DAA4D;IAC5D,sCAAsC;IACtC,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAElC,8BAA8B;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,YAAY,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAE3C,gEAAgE;IAChE,uDAAuD;IACvD,MAAM,SAAS,GAAG,MAAM,GAAG,CACzB,YAAY,EACZ,CAAC,4BAA4B,EAAE,+BAA+B,CAAC,EAC/D,qBAAqB,CACtB,CAAC;IACF,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,OAAO;QACL,SAAS,EAAE,IAAI;QACf,IAAI;QACJ,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,aAAa;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,wDAAwD;IAC1H,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjF,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAiB,EAAE;QAC/C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACb,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACZ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACf,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;QACrB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;QACtB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACd,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QACpB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;QACrB,uBAAuB,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,uBAAuB,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,kBAAkB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3B,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;QACrB,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QACf,qBAAqB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC9B,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1B,uBAAuB,EAAE,GAAG,CAAC,EAAE,CAAC;QAChC,mBAAmB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5B,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC;QAC1B,6BAA6B,EAAE,GAAG,CAAC,EAAE,CAAC;QACtC,8BAA8B,EAAE,GAAG,CAAC,EAAE,CAAC;QACvC,+BAA+B,EAAE,GAAG,CAAC,EAAE,CAAC;QACxC,gCAAgC,EAAE,GAAG,CAAC,EAAE,CAAC;QACzC,wBAAwB,EAAE,WAAW,CAAC,EAAE,CAAC;QACzC,wBAAwB,EAAE,WAAW,CAAC,EAAE,CAAC;QACzC,qBAAqB,EAAE,WAAW,CAAC,EAAE,CAAC;QACtC,uBAAuB,EAAE,KAAK,EAAE,+BAA+B;QAC/D,0BAA0B,EAAE,IAAI,EAAE,kBAAkB;QACpD,wBAAwB,EAAE,IAAI,EAAI,kBAAkB;QACpD,iBAAiB,EAAE,WAAW,CAAC,EAAE,CAAC;QAClC,YAAY,EAAE,EAAE,EAAE,4BAA4B;QAC9C,yBAAyB,EAAE,EAAE,EAAE,+BAA+B;KAC/D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAW;IAC9C,6DAA6D;IAC7D,8DAA8D;IAC9D,gEAAgE;IAChE,kEAAkE;IAClE,WAAW;IACX,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,+EAA+E;QAC/E,yEAAyE;QACzE,oEAAoE;QACpE,2EAA2E;QAC3E,iEAAiE;QACjE,gDAAgD;QAChD,MAAM,YAAY,GAChB,KAAK,CAAC,KAAK,CAAC,0DAA0D,CAAC;YACvE,KAAK,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,IAAI,CAAC,YAAY;YAAE,SAAS;QAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;YAC5B,CAAC,UAAU,EAAE,UAAU,CAAC;YACxB,CAAC,6BAA6B,EAAE,6BAA6B,CAAC;YAC9D,CAAC,cAAc,EAAE,cAAc,CAAC;YAChC,CAAC,aAAa,EAAE,aAAa,CAAC;YAC9B,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;YAC9C,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;YAC7C,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;YAC9C,CAAC,YAAY,EAAE,YAAY,CAAC;YAC5B,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;YAClD,CAAC,wBAAwB,EAAE,uBAAuB,CAAC,EAAE,oBAAoB;SACjE,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,IAAI,MAAM,CACnB,qCAAqC,MAAM,8CAA8C,MAAM,GAAG,CACnG,CAAC;YACF,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,GAAG,OAAO,CAAC;QAC5C,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAuB;YAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC/B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,MAAM,GAAG,GAAG,MAAM,GAAG,CACnB,YAAY,EACZ,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAC9C,qBAAqB,CACtB,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,4CAA4C;IAC5C,iDAAiD;IACjD,+BAA+B;IAC/B,8BAA8B;IAC9B,+BAA+B;IAC/B,EAAE;IACF,iEAAiE;IACjE,gEAAgE;IAChE,4DAA4D;IAC5D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACxD,IAAI,KAA2B,CAAC;QAChC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;YACnC,SAAS,GAAG,EAAE,CAAC;QACjB,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,GAAG,UAAU,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,0DAA0D;YAC1D,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC3F,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,sDAAsD;QACtD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,aAAa;IAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,mCAAmC;IACnE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAClB,8DAA8D,CAC/D,IAAI,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC5E,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACrC,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,QAAQ;YAAE,SAAS;QAC3C,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,QAAQ,GAAyB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3D,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;gBACrB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,aAAa,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClF,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,GAAG;YACZ,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACzG,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,KAAK,UAAU,YAAY;IACzB,yDAAyD;IACzD,kEAAkE;IAClE,iEAAiE;IACjE,mEAAmE;IACnE,0DAA0D;IAC1D,iBAAiB;IACjB,EAAE;IACF,gEAAgE;IAChE,+DAA+D;IAC/D,mCAAmC;IACnC,MAAM,SAAS,GAAG,MAAM,GAAG,CACzB,OAAO,EACP,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAC3B,eAAe,CAChB,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,0EAA0E;SACnF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,MAAM;QACtB,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,EAAE;QACnB,oBAAoB,EAAE,EAAE;QACxB,gCAAgC,EAAE,CAAC;QACnC,8BAA8B,EAAE,CAAC;QACjC,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzC,iBAAiB,EAAE,IAAI;QACvB,kBAAkB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,+BAA+B;KAC9E,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E,KAAK,UAAU,gBAAgB,CAC7B,KAAsB;IAEtB,gEAAgE;IAChE,kEAAkE;IAClE,+DAA+D;IAC/D,mEAAmE;IACnE,EAAE;IACF,qDAAqD;IACrD,8DAA8D;IAC9D,mEAAmE;IACnE,oEAAoE;IACpE,4CAA4C;IAC5C,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EACJ,wIAAwI;KAC3I,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;IACZ,WAAW;IACX,kBAAkB;CACnB,CAAC"}
1
+ {"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/collect/gpu.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,10 @@ export function parseZpoolStatus(zpoolStatus) {
34
34
  const pools = [];
35
35
  let current = null;
36
36
  let section = "none";
37
+ // Per-pool bookkeeping: did we see a `scan:` line for the current
38
+ // pool? Kept out of the serialized ZfsPool object so it doesn't
39
+ // leak into the snapshot.
40
+ let sawScanLine = false;
37
41
  for (const line of zpoolStatus.split("\n")) {
38
42
  const poolMatch = line.match(/^\s*pool:\s*(.+)/);
39
43
  if (poolMatch) {
@@ -47,6 +51,7 @@ export function parseZpoolStatus(zpoolStatus) {
47
51
  };
48
52
  pools.push(current);
49
53
  section = "none";
54
+ sawScanLine = false;
50
55
  continue;
51
56
  }
52
57
  if (!current)
@@ -59,10 +64,25 @@ export function parseZpoolStatus(zpoolStatus) {
59
64
  const errorsMatch = line.match(/^\s*errors:\s*(.+)/);
60
65
  if (errorsMatch) {
61
66
  current.errors_text = errorsMatch[1].trim();
67
+ // Fresh-pool case: ZFS 2.2+ omits the `scan:` line entirely
68
+ // until the first scrub is initiated. Reaching `errors:` without
69
+ // ever seeing `scan:` means this pool has never been scrubbed.
70
+ // The `errors:` line is the canonical end-of-pool marker, so
71
+ // this is a stable place to assert.
72
+ if (!sawScanLine && current.scrub_never_run === undefined) {
73
+ current.scrub_never_run = true;
74
+ }
62
75
  continue;
63
76
  }
64
- // Parse scrub info
77
+ // Parse scrub info. A `scan:` line may say "none requested" (the
78
+ // explicit never-run signal) OR may be absent entirely on a
79
+ // freshly-created pool (ZFS 2.2+ omits the line until a scrub
80
+ // is initiated). Fresh-pool case is handled at the end of the
81
+ // pool block: if we reach `errors:` without having seen `scan:`,
82
+ // we mark scrub_never_run. The handler below covers the
83
+ // explicit-string case.
65
84
  if (line.includes("scan:")) {
85
+ sawScanLine = true;
66
86
  if (line.includes("none requested")) {
67
87
  current.scrub_never_run = true;
68
88
  }
@@ -78,24 +98,27 @@ export function parseZpoolStatus(zpoolStatus) {
78
98
  }
79
99
  }
80
100
  }
81
- // Section switching. `config:` opens the vdev tree; `logs`,
82
- // `cache`, `spares` appear as bare lines (no colon, no leading
83
- // tab) within the config block as section markers per zpool(8).
101
+ // Section switching. `config:` opens the vdev tree. Section
102
+ // markers `logs`, `cache`, `spares` appear inside the config
103
+ // block. The exact whitespace varies by ZFS version: pre-2.0
104
+ // emitted them unindented; ZFS 2.2 emits a leading TAB and a
105
+ // trailing TAB (verified live on val-mz62hd 2026-05-21:
106
+ // "\tlogs\t\n"). The older parser only matched the unindented
107
+ // form, which routed every SLOG vdev into the wrong field on
108
+ // modern hosts. Match either form.
84
109
  if (line.startsWith("config:")) {
85
110
  section = "config";
86
111
  continue;
87
112
  }
88
- // Section headers in the config block ('logs', 'cache', 'spares')
89
- // appear unindented (no tab prefix) per the `zpool status` format.
90
- if (/^logs\s*$/.test(line)) {
113
+ if (/^\s*logs\s*$/.test(line)) {
91
114
  section = "logs";
92
115
  continue;
93
116
  }
94
- if (/^cache\s*$/.test(line)) {
117
+ if (/^\s*cache\s*$/.test(line)) {
95
118
  section = "cache";
96
119
  continue;
97
120
  }
98
- if (/^spares\s*$/.test(line)) {
121
+ if (/^\s*spares\s*$/.test(line)) {
99
122
  section = "spares";
100
123
  continue;
101
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zfs.js","sourceRoot":"","sources":["../../src/collect/zfs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zfs.js","sourceRoot":"","sources":["../../src/collect/zfs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAGrC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,8BAA8B;IAC9B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAErD,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAQD,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC,CAAC,qBAAqB;IACxE,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,mEAAmE;IACnE,iEAAiE;IACjE,gDAAgD;IAChD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAmB,IAAI,CAAC;IACnC,IAAI,OAAO,GAAe,MAAM,CAAC;IACjC,kEAAkE;IAClE,gEAAgE;IAChE,0BAA0B;IAC1B,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG;gBACR,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACzB,KAAK,EAAE,SAAS;gBAChB,WAAW,EAAE,EAAE;gBACf,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,EAAE;aAChB,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,GAAG,MAAM,CAAC;YACjB,WAAW,GAAG,KAAK,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,4DAA4D;YAC5D,iEAAiE;YACjE,+DAA+D;YAC/D,6DAA6D;YAC7D,oCAAoC;YACpC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC1D,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YACjC,CAAC;YACD,SAAS;QACX,CAAC;QAED,iEAAiE;QACjE,4DAA4D;QAC5D,8DAA8D;QAC9D,8DAA8D;QAC9D,iEAAiE;QACjE,wDAAwD;QACxD,wBAAwB;QACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAC/E,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBACxC,OAAO,CAAC,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvD,CAAC;gBACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACzC,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,6DAA6D;QAC7D,6DAA6D;QAC7D,6DAA6D;QAC7D,wDAAwD;QACxD,8DAA8D;QAC9D,6DAA6D;QAC7D,mCAAmC;QACnC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,QAAQ,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,MAAM,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,OAAO,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,QAAQ,CAAC;YACnB,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,8DAA8D;QAC9D,8DAA8D;QAC9D,2CAA2C;QAC3C,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACtE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACxD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC9B,0DAA0D;gBAC1D,8DAA8D;gBAC9D,8DAA8D;gBAC9D,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI;oBAAE,SAAS;gBACpC,MAAM,IAAI,GAAY;oBACpB,IAAI;oBACJ,KAAK;oBACL,gBAAgB,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ;oBAC1E,oBAAoB,EAAE,CAAC;iBACxB,CAAC;gBACF,IAAI,OAAO,KAAK,QAAQ;oBAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBAC9C,IAAI,OAAO,KAAK,MAAM;oBAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACtD,IAAI,OAAO,KAAK,OAAO;oBAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7D,SAAS;YACX,CAAC;YACD,+DAA+D;YAC/D,sDAAsD;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACvD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;oBACrB,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxD,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBACD,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1D,OAAO,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC7D,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,EAAE,CAAC;gBACL,IAAI,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBACxC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { run, runDetailed, looksLikeFieldRenameError } from "../exec.js";
3
+ describe("looksLikeFieldRenameError", () => {
4
+ // Real-world fixtures from the two Crucible bugs that motivated this
5
+ // defense. If the heuristic stops recognising these strings, the next
6
+ // driver-version rename will hide for hours again.
7
+ it("matches the v0.13.2 driver-550 clocks_event_reasons rename", () => {
8
+ expect(looksLikeFieldRenameError('Field "clocks_event_reasons.hw_power_brake" is not a valid field to query.')).toBe(true);
9
+ });
10
+ it("matches the v0.13.0 retired_pages.double_bit_ecc typo", () => {
11
+ expect(looksLikeFieldRenameError('Field "retired_pages.double_bit_ecc.count" is not a valid field to query.')).toBe(true);
12
+ });
13
+ it("matches generic 'unknown field' phrasing", () => {
14
+ expect(looksLikeFieldRenameError("ERROR: unknown field 'foo_bar'")).toBe(true);
15
+ });
16
+ it("matches 'no such field' phrasing", () => {
17
+ expect(looksLikeFieldRenameError("no such field: bar")).toBe(true);
18
+ });
19
+ it("matches XML tag-not-found pattern", () => {
20
+ expect(looksLikeFieldRenameError("<clocks_throttle_reasons>: not found in driver 550 output")).toBe(true);
21
+ });
22
+ it("does NOT match empty stderr", () => {
23
+ expect(looksLikeFieldRenameError("")).toBe(false);
24
+ });
25
+ it("does NOT match unrelated permission failures", () => {
26
+ expect(looksLikeFieldRenameError("Permission denied")).toBe(false);
27
+ });
28
+ it("does NOT match real GPU-lost faults (different bug class)", () => {
29
+ expect(looksLikeFieldRenameError("Unable to determine the device handle for GPU 0000:00:00.0: GPU is lost.")).toBe(false);
30
+ });
31
+ });
32
+ describe("runDetailed", () => {
33
+ it("returns installed=false on ENOENT", async () => {
34
+ const res = await runDetailed("/no/such/binary-9j43k", []);
35
+ expect(res.installed).toBe(false);
36
+ expect(res.stdout).toBeNull();
37
+ expect(res.exitCode).toBeNull();
38
+ });
39
+ it("returns installed=true + exit 0 + stdout for a normal command", async () => {
40
+ const res = await runDetailed("echo", ["hello"]);
41
+ expect(res.installed).toBe(true);
42
+ expect(res.exitCode).toBe(0);
43
+ expect(res.stdout?.trim()).toBe("hello");
44
+ expect(res.timedOut).toBe(false);
45
+ });
46
+ it("returns exitCode + stderr for a non-zero exit", async () => {
47
+ // `false` is /usr/bin/false on most systems; exits 1 with no output.
48
+ const res = await runDetailed("sh", ["-c", "echo bar >&2; exit 5"]);
49
+ expect(res.installed).toBe(true);
50
+ expect(res.exitCode).toBe(5);
51
+ expect(res.stderr.trim()).toBe("bar");
52
+ });
53
+ it("captures stderr even on exit 0 — the silent-no-op detection path", async () => {
54
+ // This is the v0.13.0 / v0.13.2 shape: tool returns success exit
55
+ // code but stderr says the field is unknown. runDetailed must
56
+ // capture the stderr so the caller can apply looksLikeFieldRenameError.
57
+ const res = await runDetailed("sh", ["-c", "echo 'Field \"foo\" is not a valid field to query.' >&2; exit 0"]);
58
+ expect(res.installed).toBe(true);
59
+ expect(res.exitCode).toBe(0);
60
+ expect(res.stdout?.trim()).toBe("");
61
+ expect(looksLikeFieldRenameError(res.stderr)).toBe(true);
62
+ });
63
+ });
64
+ describe("run (backwards-compat shim)", () => {
65
+ it("returns null when command not installed", async () => {
66
+ expect(await run("/no/such/binary-9j43k", [])).toBeNull();
67
+ });
68
+ it("returns stdout for a normal command", async () => {
69
+ const out = await run("echo", ["hi"]);
70
+ expect(out?.trim()).toBe("hi");
71
+ });
72
+ });
73
+ //# sourceMappingURL=exec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/exec.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1,10 @@
1
1
  export declare function run(cmd: string, args: string[], timeoutMs?: number): Promise<string | null>;
2
+ export interface RunDetailedResult {
3
+ installed: boolean;
4
+ exitCode: number | null;
5
+ stdout: string | null;
6
+ stderr: string;
7
+ timedOut: boolean;
8
+ }
9
+ export declare function runDetailed(cmd: string, args: string[], timeoutMs?: number): Promise<RunDetailedResult>;
10
+ export declare function looksLikeFieldRenameError(stderr: string): boolean;
package/dist/lib/exec.js CHANGED
@@ -1,19 +1,54 @@
1
1
  import { execFile } from "child_process";
2
2
  import { promisify } from "util";
3
3
  const execFileAsync = promisify(execFile);
4
+ // Backwards-compatible: existing callers get a string or null.
5
+ // The new runDetailed() returns stderr + exitCode + presence info so
6
+ // callers can distinguish "tool not installed" from "tool exited 0
7
+ // with empty stdout but errored to stderr". The latter is the silent-
8
+ // regression class that hid the v0.13.0 `retired_pages.double_bit_ecc`
9
+ // typo + the v0.13.2 `clocks_event_reasons` rename for ~24h each: in
10
+ // both cases nvidia-smi exited 0 with stderr saying "field not found"
11
+ // and Crucible's collectors processed empty stdout as "no data".
4
12
  export async function run(cmd, args, timeoutMs = 10000) {
13
+ const res = await runDetailed(cmd, args, timeoutMs);
14
+ return res.installed && res.stdout !== null ? res.stdout : null;
15
+ }
16
+ export async function runDetailed(cmd, args, timeoutMs = 10000) {
5
17
  try {
6
- const { stdout } = await execFileAsync(cmd, args, { timeout: timeoutMs });
7
- return stdout;
18
+ const { stdout, stderr } = await execFileAsync(cmd, args, { timeout: timeoutMs });
19
+ return { installed: true, exitCode: 0, stdout, stderr: stderr ?? "", timedOut: false };
8
20
  }
9
21
  catch (err) {
10
- if (err.code === "ENOENT")
11
- return null; // command not installed
12
- if (err.killed)
13
- return null; // timeout
14
- if (err.stdout)
15
- return err.stdout; // non-zero exit but has output
16
- return null;
22
+ if (err.code === "ENOENT") {
23
+ return { installed: false, exitCode: null, stdout: null, stderr: "", timedOut: false };
24
+ }
25
+ if (err.killed) {
26
+ return { installed: true, exitCode: null, stdout: null, stderr: "", timedOut: true };
27
+ }
28
+ return {
29
+ installed: true,
30
+ exitCode: typeof err.code === "number" ? err.code : null,
31
+ stdout: typeof err.stdout === "string" ? err.stdout : null,
32
+ stderr: typeof err.stderr === "string" ? err.stderr : "",
33
+ timedOut: false,
34
+ };
17
35
  }
18
36
  }
37
+ // Heuristic: does this stderr look like the "field/tag name not found"
38
+ // pattern that nvidia-smi (and others) emit when a query field has
39
+ // been renamed by a tool upgrade? Used by the gpu.ts collector's
40
+ // silent-no-op detector. The pattern is intentionally conservative:
41
+ // false positives degrade gracefully (an extra WARN log), false
42
+ // negatives are the original bug class we're trying to prevent.
43
+ export function looksLikeFieldRenameError(stderr) {
44
+ if (!stderr)
45
+ return false;
46
+ const lower = stderr.toLowerCase();
47
+ return (lower.includes("is not a valid field") ||
48
+ lower.includes("unknown field") ||
49
+ lower.includes("invalid field") ||
50
+ lower.includes("no such field") ||
51
+ lower.includes("not recognized") ||
52
+ /<[a-z_]+>.*not found/.test(lower));
53
+ }
19
54
  //# sourceMappingURL=exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,SAAS,GAAG,KAAK;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,CAAC,wBAAwB;QAChE,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QACvC,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,+BAA+B;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,+DAA+D;AAC/D,qEAAqE;AACrE,mEAAmE;AACnE,sEAAsE;AACtE,uEAAuE;AACvE,qEAAqE;AACrE,sEAAsE;AACtE,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,SAAS,GAAG,KAAK;IACtE,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,IAAc,EACd,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACzF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACzF,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvF,CAAC;QACD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YACxD,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;YAC1D,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACxD,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,mEAAmE;AACnE,iEAAiE;AACjE,oEAAoE;AACpE,gEAAgE;AAChE,gEAAgE;AAChE,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,CACL,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CACnC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassmkr/crucible",
3
- "version": "0.13.2",
3
+ "version": "0.13.4",
4
4
  "description": "Lightweight bare metal server monitoring. IPMI, SMART, OS, network. Opinionated alerts.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",