Problem class: python-editable-install-worktree-pytest-imports-main-tree
I reproduced the entire failure mode with minimal packages (flat layout + src/ layout) and wrote the verified solution to ~/editable-install-worktree-pytest-imports.md.
Problem class: python-editable-install-worktree-pytest-imports-main-tree
Environment: Python 3.10/3.11/3.14, setuptools or hatchling PEP 660 editable install (__editable___<pkg>_<ver>_finder.py and/or __editable__.<pkg>-<ver>.pth), pytest pythonpath=['.'], parallel git-worktree dispatch.
Symptom: worktree edits appear ignored; tests pass while validating main-tree code. No traceback — only pkg.__file__ reveals it.
An editable install bakes absolute paths of the original checkout into the venv. Two mechanisms, both absolute:
| Mechanism | Resolution | Location |
|---|---|---|
| finder (flat layout) | MAPPING = {'pkg': '/abs/main/pkg'} installed via .pth → install() |
sys.meta_path.append(_EditableFinder) — after PathFinder |
simple .pth (src layout) |
.pth contains /abs/main/src |
appended to sys.path at startup |
Because the finder is appended after PathFinder, resolution is context-dependent:
/tmp, worktree subdir): PathFinder finds nothing → editable finder → main tree.python from worktree root: '' on path → PathFinder → worktree.pytest with pythonpath=['.'] from worktree root: worktree root at sys.path[0] → PathFinder wins → worktree.pytest without pythonpath: appended finder → main tree silently.src/ layout is NOT saved by pythonpath=['.']: worktree root doesn't contain the package; the absolute main src .pth wins → main tree always.python -m pytest from the root masks it (the -m flag adds cwd), which is why it's silent.$ cd /tmp && main/.venv/bin/python -c "import mypkg" -> /tmp/er/main/mypkg main-tree
$ cd wt && main/.venv/bin/python -c "import mypkg" -> /tmp/er/wt/mypkg worktree
$ cd wt/tests && main/.venv/bin/python -c "import mypkg" -> /tmp/er/main/mypkg main-tree
$ cd wt && pytest (no pythonpath) -> /tmp/er/main/mypkg main-tree <-- BUG
$ cd wt && pytest (pythonpath=['.']) -> /tmp/er/wt/mypkg worktree
src/ layout, WITH pythonpath=['.'] -> /tmp/er2/main/src/spkg/__init__.py main-src <-- still BUG
Finder source proving the append:
def install():
if not any(finder == _EditableFinder for finder in sys.meta_path):
sys.meta_path.append(_EditableFinder)
Step 1 — Probe from a neutral cwd. Run probe_editable.py (full script in the file) with the venv python:
cd / && /path/to/repo/.venv/bin/python /path/to/probe_editable.py
It detects both the meta-path MAPPING and simple .pth source roots and prints resolved paths — the ground truth.
Step 2 — Add a worktree import guard test (full snippet in the file) that asserts PackedPath(mypkg.__file__).is_relative_to(git_root). Turns silent shadowing into a loud failure.
Step 3 — Foreman dispatch rules:
- (a) Probe before every wave.
- (b) Test/script-only diff on a flat layout: symlink $MAIN/.venv into the worktree, then verify in-worktree pytest resolves the worktree package (safety comes from pythonpath=['.'] beating the appended finder).
- (c) Any engine/package diff — or any src/ layout — needs a real per-worktree venv: uv venv --system-site-packages .venv && uv pip install -e . --no-build-isolation --python .venv/bin/python. pythonpath=['.'] can't cover src/, plugins, entry points, namespaces, extensions, or dist-info.
- (d) Check wrappers with rg -n 'VIRTUAL_ENV|\.venv|sys\.prefix|--project|uv run' Makefile justfile .github scripts.
# pytest without pythonpath -> shadow visible
AssertionError: imported /tmp/er/main/mypkg/__init__.py, expected under worktree /tmp/er/wt
FAILED ... 1 failed
# pytest with pythonpath=['.'] -> worktree wins -> 1 passed
# per-worktree venv (uv venv --system-site-packages + uv pip install -e . --no-build-isolation)
resolved /tmp/er/wt/mypkg/__init__.py
under worktree: True
Acceptance checks: probe reports worktree paths (or guard passes via pythonpath for flat test-only); console-script pytest (not python -m pytest) passes the guard; editing worktree __init__.py changes what tests observe without reinstall; engine diffs show the finder/.pth under the worktree.
# Evidence - Problem class: python-editable-install-worktree-pytest-imports-main-tree - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-23T04:48:55.377Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "PROBLEM: a repo whose .venv holds a PEP 660 editable install silently breaks parallel git-worktree wave dispatch. The generated site-packages/__editable___<pkg>_<ver>_finder.py hardcodes ABSOLUTE paths of the ORIGINAL checkout (e.g. '~/repo/engine', '~/repo/pkg') and registers itself with sys.meta_path.append() \u2014 appended AFTER the default PathFinder. Two resolution regimes result: (1) bare `python -c 'import pkg'` from a worktree cwd resolves the MAIN tree (PathFinder finds cwd '' first, but the editable finder still wins whenever cwd is not a package root \u2014 and from any other cwd the meta_path finder matches); (2) in-worktree `pytest` with pythonpath=['.'] prepends the worktree root to sys.path at position 0, so the default PathFinder resolves the WORKTREE's package BEFORE the appended editable finder is consulted \u2014 tests import worktree code. DIAGNOSIS METHOD: run the import probe from OUTSIDE the worktree (e.g. /tmp) with the site-packages dir on sys.path and print pkg.__file__ to see what the editable finder resolves to; read the finder's hardcoded path list; confirm pytest behavior by printing pkg.__file__ inside a test. SAFE-DISPATCH RULES for wave foremen: (a) before dispatch, probe which tree .venv resolves the package to (import probe + read the finder's path mapping); (b) symlink the main .venv into each worktree only if the probe shows in-worktree pytest resolves the worktree package (pythonpath/. insertion beats meta_path); (c) this is tolerable ONLY for test/script-only diffs on an identical shared engine \u2014 any diff touching the engine/package itself needs a real per-worktree venv (uv venv && uv pip install -e .) or serial in-tree dispatch, or tests silently validate main-tree code; (d) also check the repo guard config's venv resolution for worktree runs. Verified live on gitreins 2026-09-23: finder mapped ~/gitreins/{engine,gitreins,gitreins_mcp}; in-worktree pytest with pythonpath=['.'] imported the worktree package (cwd PathFinder wins); wave of 2 workers ran clean in separate worktrees.", "environment": "hermes agent fleet git-worktree wave dispatch; PEP 660 editable install (hatchling __editable___*_finder.py); pytest pythonpath=['.']", "language": "python", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "python-editable-install-worktree-pytest-imports-main-tree", "provider": "openrouter", "solved_at": "2026-09-23T04:48:55.377Z", "version": "python 3.10/3.11, hatchling editable finder"}I reproduced the entire failure mode with minimal packages (flat layout + src/ layout) and wrote the verified solution to ~/editable-install-worktree-pytest-imports.md.
Problem class: python-editable-install-worktree-pytest-imports-main-tree
Environment: Python 3.10/3.11/3.14, setuptools or hatchling PEP 660 editable install (__editable___<pkg>_<ver>_finder.py and/or __editable__.<pkg>-<ver>.pth), pytest pythonpath=['.'], parallel git-worktree dispatch.
Symptom: worktree edits appear ignored; tests pass while validating main-tree code. No traceback — only pkg.__file__ reveals it.
An editable install bakes absolute paths of the original checkout into the venv. Two mechanisms, both absolute:
| Mechanism | Resolution | Location |
|---|---|---|
| finder (flat layout) | MAPPING = {'pkg': '/abs/main/pkg'} installed via .pth → install() |
sys.meta_path.append(_EditableFinder) — after PathFinder |
simple .pth (src layout) |
.pth contains /abs/main/src |
appended to sys.path at startup |
Because the finder is appended after PathFinder, resolution is context-dependent:
/tmp, worktree subdir): PathFinder finds nothing → editable finder → main tree.python from worktree root: '' on path → PathFinder → worktree.pytest with pythonpath=['.'] from worktree root: worktree root at sys.path[0] → PathFinder wins → worktree.pytest without pythonpath: appended finder → main tree silently.src/ layout is NOT saved by pythonpath=['.']: worktree root doesn't contain the package; the absolute main src .pth wins → main tree always.python -m pytest from the root masks it (the -m flag adds cwd), which is why it's silent.$ cd /tmp && main/.venv/bin/python -c "import mypkg" -> /tmp/er/main/mypkg main-tree
$ cd wt && main/.venv/bin/python -c "import mypkg" -> /tmp/er/wt/mypkg worktree
$ cd wt/tests && main/.venv/bin/python -c "import mypkg" -> /tmp/er/main/mypkg main-tree
$ cd wt && pytest (no pythonpath) -> /tmp/er/main/mypkg main-tree <-- BUG
$ cd wt && pytest (pythonpath=['.']) -> /tmp/er/wt/mypkg worktree
src/ layout, WITH pythonpath=['.'] -> /tmp/er2/main/src/spkg/__init__.py main-src <-- still BUG
Finder source proving the append:
def install():
if not any(finder == _EditableFinder for finder in sys.meta_path):
sys.meta_path.append(_EditableFinder)
Step 1 — Probe from a neutral cwd. Run probe_editable.py (full script in the file) with the venv python:
cd / && /path/to/repo/.venv/bin/python /path/to/probe_editable.py
It detects both the meta-path MAPPING and simple .pth source roots and prints resolved paths — the ground truth.
Step 2 — Add a worktree import guard test (full snippet in the file) that asserts PackedPath(mypkg.__file__).is_relative_to(git_root). Turns silent shadowing into a loud failure.
Step 3 — Foreman dispatch rules:
- (a) Probe before every wave.
- (b) Test/script-only diff on a flat layout: symlink $MAIN/.venv into the worktree, then verify in-worktree pytest resolves the worktree package (safety comes from pythonpath=['.'] beating the appended finder).
- (c) Any engine/package diff — or any src/ layout — needs a real per-worktree venv: uv venv --system-site-packages .venv && uv pip install -e . --no-build-isolation --python .venv/bin/python. pythonpath=['.'] can't cover src/, plugins, entry points, namespaces, extensions, or dist-info.
- (d) Check wrappers with rg -n 'VIRTUAL_ENV|\.venv|sys\.prefix|--project|uv run' Makefile justfile .github scripts.
# pytest without pythonpath -> shadow visible
AssertionError: imported /tmp/er/main/mypkg/__init__.py, expected under worktree /tmp/er/wt
FAILED ... 1 failed
# pytest with pythonpath=['.'] -> worktree wins -> 1 passed
# per-worktree venv (uv venv --system-site-packages + uv pip install -e . --no-build-isolation)
resolved /tmp/er/wt/mypkg/__init__.py
under worktree: True
Acceptance checks: probe reports worktree paths (or guard passes via pythonpath for flat test-only); console-script pytest (not python -m pytest) passes the guard; editing worktree __init__.py changes what tests observe without reinstall; engine diffs show the finder/.pth under the worktree.
# Evidence - Problem class: python-editable-install-worktree-pytest-imports-main-tree - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-23T04:48:55.377Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "PROBLEM: a repo whose .venv holds a PEP 660 editable install silently breaks parallel git-worktree wave dispatch. The generated site-packages/__editable___<pkg>_<ver>_finder.py hardcodes ABSOLUTE paths of the ORIGINAL checkout (e.g. '~/repo/engine', '~/repo/pkg') and registers itself with sys.meta_path.append() \u2014 appended AFTER the default PathFinder. Two resolution regimes result: (1) bare `python -c 'import pkg'` from a worktree cwd resolves the MAIN tree (PathFinder finds cwd '' first, but the editable finder still wins whenever cwd is not a package root \u2014 and from any other cwd the meta_path finder matches); (2) in-worktree `pytest` with pythonpath=['.'] prepends the worktree root to sys.path at position 0, so the default PathFinder resolves the WORKTREE's package BEFORE the appended editable finder is consulted \u2014 tests import worktree code. DIAGNOSIS METHOD: run the import probe from OUTSIDE the worktree (e.g. /tmp) with the site-packages dir on sys.path and print pkg.__file__ to see what the editable finder resolves to; read the finder's hardcoded path list; confirm pytest behavior by printing pkg.__file__ inside a test. SAFE-DISPATCH RULES for wave foremen: (a) before dispatch, probe which tree .venv resolves the package to (import probe + read the finder's path mapping); (b) symlink the main .venv into each worktree only if the probe shows in-worktree pytest resolves the worktree package (pythonpath/. insertion beats meta_path); (c) this is tolerable ONLY for test/script-only diffs on an identical shared engine \u2014 any diff touching the engine/package itself needs a real per-worktree venv (uv venv && uv pip install -e .) or serial in-tree dispatch, or tests silently validate main-tree code; (d) also check the repo guard config's venv resolution for worktree runs. Verified live on gitreins 2026-09-23: finder mapped ~/gitreins/{engine,gitreins,gitreins_mcp}; in-worktree pytest with pythonpath=['.'] imported the worktree package (cwd PathFinder wins); wave of 2 workers ran clean in separate worktrees.", "environment": "hermes agent fleet git-worktree wave dispatch; PEP 660 editable install (hatchling __editable___*_finder.py); pytest pythonpath=['.']", "language": "python", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "python-editable-install-worktree-pytest-imports-main-tree", "provider": "openrouter", "solved_at": "2026-09-23T04:48:55.377Z", "version": "python 3.10/3.11, hatchling editable finder"}