Verified: IT hardware (SNMP, Redfish, node_exporter)
Each claim the IT hardware (SNMP, Redfish, node_exporter) page makes, with the tests that
prove it in the last green CI run: 7 of 35 verified, 2 with no test yet.
The claims live in docs/claims/it-hardware.yaml.
Last green CI run 16 Oct 2026, 14:48 UTC on c7618d3 · all runtime claims
IT-001 verified
The snmp, redfish and prometheus drivers deliver one shared UDT set (Server, Fan, PSU, TempSensor, Switch, SwitchPort, PDU, PDUOutlet, UPS), so a program compiled against those types reads the values the drivers deliver.
IT-002 partly verified
The alarm members the page lists (`Fault`, `Warning`, `High`, `HighHigh`, `Down`, `Overload`, `OnBattery`, `LowBattery`, `BatteryFault`) exist on the types the table names them under, and `Down` is derived as enabled-with-no-link.
- pass
TestBaseDeliversDerivesAndReportsinhw
IT-003 partly verified
Instances are flat tags (`SW1_Port03 : SwitchPort`, `NODE1_Fan2 : Fan`, `NODE1_Temp_Inlet : TempSensor`), not arrays.
- pass
TestImportPartsinredfish/codegen - pass
TestGenerateNodeGoldeninprom/codegen
IT-004 partly verified
Each importer writes `<proto>_manifest.yaml`, `tags/<proto>.yaml` and `hw_types.st`, generated and byte-identical on re-run, and all three write the same `hw_types.st` body.
IT-005 partly verified
The generated manifest is explicit: every member of every tag names its OID, its Redfish resource and path, or its metric selector.
- pass
TestGeneratedBindingsResolveinredfish/codegen(4 of 4 passed) - pass
TestGenerateNodeEveryBindingResolvesinprom/codegen
IT-006 partly verified
An import from a recording gives the same bytes as from the live device, so a recording is a shared fixture.
- pass
TestSnmpLiveEqualsRecordingincmd/naut - pass
TestLiveImportMatchesRecordinginredfish/codegen(4 of 4 passed) - pass
TestRedfishLiveImportAndRecordincmd/naut
IT-036 verified
A live `naut prometheus import` whose scrape does not finish within `--timeout` fails rather than generating a manifest from the part of the body that arrived.
- pass
TestScrapeOnceTimeoutIsAnErrorincmd/naut
IT-008 partly verified
`manifest:` is the only required key and `New` never dials, so check and build validate every binding offline.
IT-009 partly verified
`scan-classes` and `tag-classes` assign tags to poll classes (the `slow` class for names and models), with the rest on the default interval.
IT-010 partly verified
Credentials are never in the manifest, the tag file, a log line or an error: a source names the variable (`community-env`, `auth-env`, `priv-env`, `password-env`) or the file (`community-file`, `password-file`) the driver reads where it runs.
IT-011 partly verified
An unset credential variable or unreadable file is a warning at check time (never an error, since `New` does not need the secrets) and a connect-time error naming the variable; a secret file's trailing newline is trimmed and an empty file is an error.
IT-012 verified
SNMPv3 with SHA-256 and AES-128 works, and MD5 and DES are accepted with a warning.
IT-013 partly verified
`<id>__Online` is true while the source answered within `stale-after`; a device that stops answering keeps its last values marked Stale (never a silent zero), and `__Online` goes false.
IT-014 partly verified
An unbound `Online` member on Server, Switch, PDU and UPS mirrors the `__Online` verdict, and `<id>__LastPollMs` is the poll clock.
IT-015 verified
A dark device's alarms are Suppressed rather than frozen lit when the alarm rule's `enable:` is `{site}__Online`.
- pass
a port that is enabled but has no link alarms after 15 s, and is suppressed while the switch is darkinexamples/it-rack
IT-016 partly verified
`InBps`, `OutBps` and `ErrorRate` are per-second rates of wire counters, with 32-bit wrap and 64-bit reset handled (a backwards step on a 64-bit counter is a reboot, not a wrap); a 32-bit step backwards that would mean more than half its range in one interval is a reset, an SNMP source's `sysUpTime` going backwards makes every rate across the restart a reset, a reset delivers no rate for that interval, and the first sample after connect delivers no rate.
- pass
TestCounterRateinhw - pass
TestCounterWrap32inhw - pass
TestCounterReset32inhw - pass
TestCounterDiscontinuityinhw - pass
TestCounterFloatinhw - pass
TestDriverCounterRateinsnmp - pass
TestForeignCounterRateinsnmp - pass
TestPollAgentRestartIsNotAWrapinsnmp(5 of 5 passed) - pass
TestPollReconnectResetsRateCountersinprom
IT-017 verified
A refused OID, a 404 resource or a metric the exporter no longer carries marks that tag Bad and leaves its siblings Good.
IT-018 partly verified
A transport failure (timeout, refused, bad credentials) climbs a backoff ladder from 1 s to 60 s and shows on `/api/drivers` with the reason.
IT-019 partly verified
A wrong SNMPv3 auth pass phrase reads as `authentication failed — wrong auth pass phrase or protocol for user …`, and a wrong priv pass phrase as `authentication succeeded but privacy failed`, not as a timeout.
IT-020 partly verified
A rule on `(type, member)` expands to every matching tag with `{site}`, name and `enable:` interpolated, using `site-from` to derive the site (`SW1_Port03` to `SW1`, `SW1` to `SW1`), including tags added by a later import.
- pass
TestRulesExpandAgainstComposedTagsininternal/project - pass
TestSiteFromNeedsACaptureGroupininternal/project
IT-021 partly verified
The importers generate no writable binding; a command is added by hand as a `writes:` entry bound to the member it acts on, rendered into the manifest.
- pass
TestImportFixturesinredfish/codegen(4 of 4 passed)
IT-037 partly verified
A BOOL command over SNMP must have `set:` naming the INTEGER each value writes; `naut check` refuses a BOOL write without it rather than send 0 for false.
IT-022 partly verified
A Redfish `PowerCmd` is an INT (0 none, 1 on, 2 graceful shutdown, 3 force off, 4 restart) posted exactly once on a change to a non-zero value and never as the baseline; a return to 0 sends nothing, an out-of-range value is refused with the error on the row, and the POST goes to the configured action target.
- pass
TestDriverPowerCommandinredfish
IT-023 verified
The first value seen after a start is a baseline that is never written, so `init: false` on an outlet command cannot switch the outlet off at boot.
IT-024 partly verified
Every command goes through the runtime's existing gates: a closed write gate (standby, not leader) neither queues nor records a command, and becoming leader replays nothing.
- pass
TestBaseWritesinhw
IT-026 partly verified
`naut snmp browse --record` / `naut redfish browse --record` / `naut prometheus browse --record` capture a recording that the matching importer reads (`--walk`, `--mockup`, `.prom`).
IT-027 partly verified
`naut snmp serve`, `naut redfish serve` and `naut prometheus serve` stand in for the device from its recording (a walk, a mockup, a `.prom` file), and `--ramp` drifts the SNMP and exporter values.
IT-028 no test yet
The bench stand-ins listen on `127.0.0.1:1161` (SNMP v2c), `127.0.0.1:8000` (Redfish) and `127.0.0.1:9100` (exporter) by default.
IT-029 no test yet
A Redfish recording is reviewed before committing because it carries serial numbers and addresses.
IT-030 partly verified
`examples/it-rack` runs on a laptop with a switch and a host, rules, rollups and an acceptance suite in virtual time.
- pass
PortsUp / PortsDown count links, only while the switch answersinexamples/it-rack - pass
a port that is enabled but has no link alarms after 15 s, and is suppressed while the switch is darkinexamples/it-rack - pass
a stopped fan and a critical temperature on the hostinexamples/it-rack - pass
the rack's hottest reading and its fault rollupinexamples/it-rack
IT-031 partly verified
The snmp profiles read IF-MIB/ifXTable for ports (64-bit counters, falling back to 32-bit without ifXTable), ENTITY-MIB for the chassis, ENTITY-SENSOR-MIB and POWER-ETHERNET-MIB where present, and the PDU and UPS profiles (RFC 1628 UPS-MIB, CPS-MIB).
- pass
TestSwitchPortsinsnmp/profiles - pass
TestSwitchFallsBackWithoutIfXinsnmp/profiles - pass
TestSensorNamesinsnmp/profiles - pass
TestPowerProfilesinsnmp/profiles - pass
TestForeignDecodeAgreementinsnmp(5 of 5 passed)
IT-032 partly verified
The snmp driver does one GetBulk walk per table column per poll, not one Get per port, over v2c and v3, and the agent decodes against a foreign snmpsim identically to the in-repo agent.
- pass
TestForeignDecodeAgreementinsnmp(5 of 5 passed) - pass
TestGetBulkinsnmp/agent
IT-033 partly verified
The redfish driver reads both generations (legacy `Thermal`/`Power` and `ThermalSubsystem`/`PowerSubsystem`/`Sensors`), uses sessions with basic-auth fallback, and selects array members by `MemberId` or `Name` rather than position.
IT-034 partly verified
The prometheus driver parses the node_exporter exposition format, reports a bound metric the scrape no longer carries, derives `CpuPct`, `MemPct`, `RootDiskPct` and uptime from expressions over named selectors, and takes fan and temperature sensors from hwmon.
- pass
TestParseTextRealScrapeinprom - pass
TestForeignCpuMemPollAndRateinprom - pass
TestForeignMetricRenamedAwayinprom - pass
TestGenerateNodeAgainstRealScrapeinprom/codegen - pass
TestGenerateNodeGoldeninprom/codegen - pass
TestExprEvalinhw
IT-035 verified
The prometheus driver scrapes the exporter directly, with no Prometheus server needed.