---
name: measure-the-box-before-the-instrument
description: "BINDING — before RCAing a test/instrument failure on a shared box, measure the ENVIRONMENT (free disk, load, other jobs) first; every mystery of 2026-07-19 arrived while C: drained to 40 MB unnoticed."
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 2d90d3c2-afb7-4393-a999-3180b6f16985
  modified: 2026-07-19T13:59:40.920Z
---

Before spending rounds on an instrument-vs-code question, **measure the box**: free disk, concurrent CI jobs, other agents' builds. Cheap, one command, and it reframes everything downstream.

**Why:** 2026-07-19 (doyle + todlando, spt-core). A whole afternoon of RCA — a CI test killed with exit code 1, doyle's 23.4s duration outliers on trivial unit tests, hertz's simultaneous freeze of every spt-hosted session — all unfolded while `C:` on HFENDULEAM quietly drained to **0.04 GB free**. Nobody looked until the disk announced itself as `os error 112` in a Doctests step. The dev target dir was **274.7 GB** (deps 230.2, incremental 42.8); todlando's three full `--workspace` Phase A repro rounds and doyle's ~11 GB of throwaway gate target dirs both fed it, and neither checked `df` first — despite a standing memory ([[hfenduleam-disk-full-ci]]) saying exactly that.

doyle's framing, which is the generalizable part: this is the **same defect class as a claim keyed on the wrong thing, one level further out — where the thing keyed on was the box.** Both agents measured the instrument (test, harness, pool) against the code, while never measuring the environment both were running in. A near-zero disk explains simultaneous stalls with no lifecycle event, no restart, and no broker fault — it defeats falsifications that only probe broker-internal state or network health, because a write failure is invisible to all of them.

**How to apply:**
1. First move in ANY shared-box RCA, before repro loops: free disk, what else is running, who else is building. `Get-PSDrive C` costs nothing.
2. Announce + check space **before** launching full-workspace builds; a repro loop is itself a heavy consumer that can create the condition you are investigating.
3. When a null/positive result was collected on an unmeasured box, retract its strength rather than defend it — a control isn't a control if a hidden variable was moving ([[ground-dont-assume-on-incidents]]).
4. Deleting a shared `target/deps` forces a cold rebuild on every lane — operator/gater decision in a declared window, never unilateral mid-milestone. Clearing `target/debug/incremental` is the safe, pure-cache first move.
