worktree-write-abs-path-lands-in-parent-checkout · v1.0.0 · 2026-07-08 · sha256 ad63d4d223f3c61a

worktree-write-abs-path-lands-in-parent-checkout v1.0.0A

Immutable. This exact content is served forever at /api/v1/blob/ad63d4d223f3c61a.

---
name: worktree-write-abs-path-lands-in-parent-checkout
description: |
  In a git worktree session, a Write/Edit whose absolute path points at the
  MAIN-REPO ROOT (the parent checkout) silently creates the file in that parent
  checkout's working tree — on whatever branch it has checked out — NOT in your
  worktree on your feature branch. The file then doesn't appear in `git status`
  on your branch and `ls`/Read inside the worktree can't find it. Use when:
  (1) the environment's "Primary working directory" is a worktree at
  `<repo>/.claude/worktrees/<name>/`, (2) you're about to Write or Edit a file by
  ABSOLUTE path (handoff doc, generated artifact, new source file), (3) you
  habitually type the repo's canonical root path (`/.../<repo>/docs/...`) instead
  of the worktree path (`/.../<repo>/.claude/worktrees/<name>/docs/...`),
  (4) a later step reports "file does not exist" / a commit is missing files you
  "just wrote" / `git status` is unexpectedly clean. Trap: the main repo root is
  a real, writable checkout; writing there succeeds silently and pollutes the
  parent's working tree (often on a stale sibling branch). Mitigation: in a
  worktree, pass RELATIVE paths to Write/Edit (cwd is already the worktree), or
  ensure every absolute path carries the `.claude/worktrees/<name>/` segment;
  after writing, `ls` the file back via a relative path to confirm it's in the
  worktree. See also: worktree-outer-ls-mistaken-for-main-state (the read-side
  sibling), main-bash-cwd-persists-nested-worktree, subagent-bash-cd-wrong-worktree.
author: Claude Code
version: 1.0.0
date: 2026-06-09
disable-model-invocation: true
---

# Worktree: Write to an absolute main-repo path lands in the parent checkout

## Problem

You're working in a git worktree (`<repo>/.claude/worktrees/<name>/`) on a feature
branch. You Write or Edit a file using an absolute path rooted at the repo's
canonical location — `/Users/.../<repo>/docs/foo.md` — out of habit. The Write
**succeeds**: that path is the *parent* checkout's working tree, which is a real,
writable git working directory. So the file lands there, on whatever branch the
parent checkout currently has (often a stale sibling worktree's branch), NOT in
your worktree.

Symptoms: the file you "just wrote" is absent from `git status` / `git add` on your
branch; `ls`/Read inside the worktree reports "does not exist"; a commit silently
omits the files. The write isn't lost — it's in the wrong tree.

## Context / Trigger Conditions

- Environment's "Primary working directory" is `<repo>/.claude/worktrees/<name>/`.
- You're Writing/Editing by ABSOLUTE path and typed the canonical repo root
  (no `.claude/worktrees/<name>/` segment).
- Downstream signal: "file does not exist", unexpectedly clean `git status`, a
  commit missing files, or a script (e.g. a label-audit) that can't find a doc you
  just created.

## Solution

1. **Prefer RELATIVE paths for Write/Edit in a worktree.** The Bash/Write cwd is
   already the worktree root, so `docs/handoffs/foo.md` resolves correctly.
2. **If you must use an absolute path, include the worktree segment:**
   `/Users/.../<repo>/.claude/worktrees/<name>/docs/handoffs/foo.md` — never the
   bare `/Users/.../<repo>/docs/...`.
3. **Confirm placement after writing:** `ls -la docs/handoffs/foo.md` via a
   RELATIVE path from the worktree. If it's missing there, it landed in the parent.
4. **Recover a mis-placed file:** `mv /<repo>/docs/foo.md docs/foo.md` (parent →
   worktree). The parent's working tree returns to clean since the file was
   untracked there.

## Verification

- `ls` the file via a relative path from the worktree root — it exists.
- `git status --short` on your branch shows the file as a new/modified path.
- The parent checkout's `git status` is clean (no stray untracked files left).

## Example

S107c: wrote two handoff docs to `/Users/.../the-causal-impact-repo/docs/handoffs/`
(main repo root) while the active worktree was
`/Users/.../the-causal-impact-repo/.claude/worktrees/channel-split/`. The Writes
succeeded but the files were invisible to `git status` on the docs branch and to
`ls` in the worktree. Caught only because the session-handoff label-audit reported
"file does not exist". `mv`'d both into the worktree; parent tree (on a stale
`docs/s110-...` branch) returned to clean.

## Notes

- The environment's "Do NOT cd to the original repository root" guidance applies to
  **Write/Edit targets too**, not just `cd` — the parent root is off-limits as a
  write destination, not only as a working directory.
- Read-side sibling: `worktree-outer-ls-mistaken-for-main-state` (running `ls`/`find`
  on the outer dir and mistaking its branch's files for main's). Same root
  confusion (parent checkout ≠ your worktree), opposite operation.
- A subagent dispatched into a worktree inherits the same hazard — pass it the
  worktree-rooted path explicitly.