---
name: fixture-project-under-spt-home-stops-deriving
description: "#178 widened project-attribution exclusion from owlery to ALL of $SPT_HOME — any test fixture parking a 'user project' under its temp home silently loses session-cwd derivation and falls back to membership"
metadata: 
  node_type: memory
  type: project
  originSessionId: 45faac4b-ad00-41fc-a539-73eb87103bf5
  modified: 2026-08-20T01:33:34.125Z
---

Measured 2026-08-19 at assembled head 84d8287a: `projindex_reader_e2e` red with ep1 project
`Some("alpha")` (membership fallback) where the fixture expected `Some("proj-a")` (session-cwd
head). Mechanism: #178 (`dd61878a`) widened the routing exclusion to `perch::spt_internal_root()`
= `$SPT_HOME` — a DECLARED consequence in its own commit — and the fixture placed the project at
`home/work/proj-a`, inside the temp SPT_HOME. Sibling `projindex_writer_e2e` same class.

**Why it escaped every lane gate:** #178's targeted legs never ran projindex; the ir50 lane's
781/781 ran on a tree WITHOUT #178. Only the assembled-head run could see it — the
textual-merge-hides-composition-break rule's semantic sibling (zero conflicts, real break).

**How to apply:** fixture project dirs go in a SECOND tempdir outside SPT_HOME, with a comment
naming the exclusion (`projwriter.rs` units model it: root holds `home/` AND external
`workdirs/`). When a derivation red shows a FALLBACK value instead of garbage, ask which
exclusion predicate widened. The reds also LEAK rig daemons (panic skips teardown) — and the
leaked `spt.exe` then blocks the next build-needing leg with `Access is denied (os error 5)`,
manufacturing a SECOND red that is pure downstream rig. Kin:
[[assembly-textual-merge-hides-semantic-composition-break]],
[[live-agents-lock-target-debug-spt-exe]].
