---
name: hertz-queued-post-w4
description: "Two items doyle queued to hertz's lane for AFTER DOORBELL W4 lands (2026-08-01) — close the census tail-index residual with strum::EnumIter, and diagnose the worktree crates/spt-daemon directory pin."
metadata: 
  node_type: memory
  type: project
  originSessionId: e7dd6400-80c2-48ff-bdc5-f990bbbdff71
  modified: 2026-08-02T05:35:41.709Z
---

Both approved and scheduled POST-DOORBELL-W4 (queued 2026-08-01). W4 is
todlando's redemption family, which touches the census arm anyway — the
sequencing exists so the census is edited once, not three times.

**BOTH ITEMS CLOSED 2026-08-02.** Item 1 built + mutation-proved + gated, ratified by doyle and
**PARKED** on branch `test/census-enum-iter` @5e7803b (worktree `.worktrees/hertz-census-iter`, target
junction removed so a later build mints its own). Based on main @6312b01, so it carries clean; doyle
ruled it rides the fast-follow wave's lanes when the operator names picks — deliberately NOT pushed, an
unpicked PR is noise. Spun off `releases#111`: the dispatch module's units fail 2-of-26
nondeterministically under threaded `cargo test` (three `with_home` sites at dispatch.rs 3181/3219/3251
write process-global SPT_HOME), which **CI's nextest unit lane can never see** — invisible by
construction, schedule-not-flake-registry, ruled `*_at(home)` fix shape, my lane when the wave scopes.
Item 2 closed as `releases#110` — see below.

**1. (DONE — kept for the reasoning) Close the census tail-index residual.** `dispatch.rs`
`the_family_census_is_bijective_with_the_enum` (shipped @9f4bb83) catches the add
direction at compile time and interior ALL drops, but NOT a variant given a
census arm claiming the tail index and omitted from `ALL` — mutation-confirmed
green crate-wide at 766/766. Cause in one line: both sides of the check derive
from `ALL`, so [[instrument-soundness-guards]] guard 12 applies. Fix:
`strum` is ALREADY transitive in spt-daemon (v0.28.0, verified by `cargo tree`,
NOT by grepping *.toml — that false-positives on "instrument"), so a
`[dev-dependencies] strum = { version = "0.28", features = ["derive"] }` reuses
the compiled crate; derive behind `#[cfg_attr(test, derive(strum::EnumIter))]`
keeps production bare; then `for v in StreamFamily::iter() { assert!(ALL.contains(&v)) }`.
That also fixes the remove-direction naming gap (today it names the neighbour,
not the absentee) because iteration supplies the inverse.

**2. DONE 2026-08-02 — cause was an orphaned `conhost.exe` holding the crate root as its CWD.**
Full mechanism, the read-only PEB cwd finder, and the discriminators that exonerated Search/Defender
by experiment are in [[orphan-conhost-cwd-pins-worktree]]. Producer fix + KNOWN-HAZARDS addendum +
script promotion FILED as releases#110 (doyle, 2026-08-02, fast-follow/rider pool); doyle's five
gate-9983639 orphans killed and that husk finally deleted — third live confirmation of the mechanism. Both of my pinned skeletons are gone; seven
pins on other owners' rigs were routed with pids. The plan below is superseded — handle.exe was never
needed, and the "no process under the worktree" refutation was sound but incomplete: it looked at exe
paths and command lines, and a cwd appears in neither.

**2. (superseded — original plan) Diagnose the worktree directory pin.** Two of two worktrees that ran daemon
test binaries ended with `<worktree>/crates/spt-daemon` undeletable ("Device or
resource busy") while empty — deregistered from git, all files gone, only the
directory pinned. REFUTED already: no process has an exe path or command line
under the worktree, and no `spt_daemon*` test binary survives (nextest's
`(4 leaky)` reports were the natural suspect and the pin outlives them). Plan
doyle approved: handle.exe (Sysinternals) against a fresh scratch worktree that
runs one daemon test binary, catching the holder live. **Rule out FIRST:**
Windows Search indexer and Defender real-time scan — both hold directory handles
invisibly and outlive the triggering process; handle.exe names either in one
line, and if it is one of them the fix is a `.worktrees` exclusion rule, which
also buys back scan overhead on every gate build.

The argument that won this an owner (worth reusing): the cost is not the 68K, it
is that **an exception in every reap report is the alarm that always fires**.
Until it is fixed, AGENTS.md retry-later stands and skeletons stay
reported-not-rounded.
