---
name: occupancy-is-not-contention
description: "Process and handle counts describe who is RESIDENT, not who is competing — measured: MORE foreign processes on the FASTER phase, so occupancy does not predict duration."
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 1f74e1f6-5968-4a83-a94b-b1fd8f62c4ee
  modified: 2026-09-10T08:11:45.988Z
---

**A process census answers "what is resident," never "what is contending." Report it as a
CONDITION, never as a load explanation.** todlando's correction, and it went from concession to
measurement inside one exchange, 2026-09-10, golden 34445961595 vs 34322232036.

I offered hfenduleam's census as evidence the Windows leg was load-starved:
`box_procs=644, 17 FOREIGN spt.exe` (the live agent fleet) against kitsubito's `365, 0 foreign`.
Then I pulled the pre-milestone golden's Windows leg for comparison:

| sha | census at job start | Phase A total |
|---|---|---|
| a2f335f8 (v0.68.0, shipped) | 613 procs, **27** foreign | **501.778s** |
| a9e786b2 (today, red) | 644 procs, **17** foreign | **955.716s** |

**MORE foreign processes on the run that was TWICE AS FAST.** Count and duration move in opposite
directions, so occupancy demonstrably does not predict contention on this box. My
17-foreign-processes number, offered as a load explanation, explained nothing.

⚠ **The residual fact is still real and still unexplained:** today's Phase A took 955.716s against
501.778s for the comparable pre-milestone run. What died is the EXPLANATION, not the observation —
do not let the retraction of a cause carry the measurement away with it.

**A second trap in the same census:** the FOREIGN entries were the installed fleet binary
(`AppData\Local\spt-core\bin\spt.exe`), not CI's own tree — the census separates `scoped` from
`unscoped` for exactly this reason. Read the PATH before calling growth during a run "the tests
spawning daemons"; test-spawned processes run from `target/`, which is a scope root.

**How to apply:** counts go in the record beside profile, concurrency setting, cache state,
timings, and CPU/I-O where available — as conditions to REPRODUCE, not as a cause. To claim
contention, measure contention (CPU time, I/O wait, scheduler delay), not residency. When a census
is the only instrument available, say plainly that the load question is UNMEASURED rather than
letting a big number imply it. Related:
[[whole-test-wall-time-is-not-an-internal-budget-margin]] · [[an-endorsement-is-a-claim]].
