Development record
The worktree store lives under the renamed home, `~/.abcd.noindex/worktrees/<root-sha>/<name>/`, and the rest of its rule is unchanged
Context
adr-2609091248200336
binds where a session's or an agent's worktree goes, in its location half:
~/.abcd/worktrees/<root-sha>/<name>/, keyed on the repository's root-commit
SHA, under the caller's own abcd home. Its trust rule (a tool never creates a
directory in space the user did not hand it), its verb half (the store's
verbs bind when itd-2609091014076309 ships), its create-then-prove call to
fsutil.EnsureRealDir and EnsureRealDirAll, and its list-and-reclaim
obligation are not in question here.
itd-2610030720038073
renames that home. On 2026-10-02 eight lane worktrees opened in the store set
off a desktop indexing burst (load 110 to 148 with no test running, the
indexer's processes named in the run log), and the product thinker ruled on
2026-10-03 that the whole home is renamed ~/.abcd to ~/.abcd.noindex, a
name the macOS indexer passes over when it scans (the intent's decisions 1
and 2). abcd moves nothing: an existing ~/.abcd stops every command and
hook until the person renames it (decision 6). The intent's decision 4 names
the location adr-2609091248200336 binds as one of the reversals that rename
forces, and requires a superseding record for it rather than an amended one,
because an ADR is never amended. This is that record.
adr-2610030720195401 is the rule the rename stands on: abcd keeps its folders out of indexing only by changing its own folder, never the computer's search settings.
Decision
The worktree store's location is ~/.abcd.noindex/worktrees/<root-sha>/<name>/.
A session's or an agent's worktree goes there, keyed on the repository's
root-commit SHA as before. Every spelling adr-2609091248200336 gives of the
caller's abcd home, the store's root and the trusted-roots declaration it
cites on the read side, reads ~/.abcd.noindex/ in place of ~/.abcd/.
Nothing else of adr-2609091248200336 changes. It is carried forward whole:
a tool never creates a directory in user-owned project space; agent and session
scratch is machine-scoped and keyed on the root-commit SHA; the store creates
itself through fsutil.EnsureRealDir and EnsureRealDirAll, owning its layout
and its mode and nothing else about directory creation; what a tool puts in
its own space it can list and reclaim; a directory the user made is theirs even
inside the store; and the rule binds an agent's conventions in two halves, the
location now and the verb when the store ships. The location half binds at the
new spelling from the change that renames the home.
The texts this record binds are the ones that spell the store's location, and each changes in the change that makes this record true:
AGENTS.md, § Concurrent sessions (the store's path), and thetrusted-rootsre-admission command in the rule-loader section;- the principle
the-users-directory-is-theirs, its Enforcement paragraph; - the brief's § The worktree store (
05-internals/03-configuration.md) and the build surface chapter (04-surfaces/34-build.md); commands/build.mdandcommands/implement.md, which name the lane worktree's path;- the bundled rules' scratch rule (
internal/core/rules/defaults/rules.json); - the path spelling in itd-2609091014076309 and its open spec spc-2609301811532881, each of which gains a dated decision line naming this record and changes nothing else.
It stays proposed until the change that makes it true. That change,
step 3 of spc-2610031309233367, renames the home, accepts this record, writes
supersedes: adr-2609091248200336 here and superseded_by with
status: superseded there, and changes the texts above that it carries; step 4
changes the rest. Until then adr-2609091248200336 is in force and its spelling
is the shipped one.
Alternatives Considered
- Amend adr-2609091248200336's location in place. Rejected: an ADR is never amended, always superseded, and the intent's decision 4 says so for this location by name.
- Rename only the worktree store,
~/.abcd/worktrees.noindex/, and leave the home's name alone. Rejected by the intent's decision 2: the whole home is renamed, because the home's other stores (the lab, transcripts, sources, run logs) cost the indexer the same scan. - Leave the location's text naming
~/.abcd/and let the reader infer the rename. Rejected: the location half binds a convention an agent follows by reading it, and a convention naming a folder that stops abcd sends every session's worktree into the folder the stop refuses. - Chosen: a successor that changes only the spelling and carries the rest of the rule forward unchanged.
Consequences
- adr-2609091248200336 is superseded and retained once this record is
accepted.
AGENTS.md, the principle, the brief and two intents cite it, so it keeps its decision text as written, with both halves of the supersession in its frontmatter; its own supersession of adr-2609091014087993 is untouched. - A worktree made under
~/.abcd/worktrees/before the rename moves with the folder. The person renames the whole home, so its worktree lane arrives at the new spelling with it; git's own records of where each worktree lives are the person's to repair withgit worktree repair, as for any moved checkout. abcd moves and repairs nothing (the intent's decision 6). - The store's verbs land at the new spelling. spc-2609301811532881 builds
abcd ahoy worktreefrom the store root; whichever of its step 1 and the home resolver lands second takes the root from the resolver. - The transcript store's spelling is its own record,
adr-2610031751066232,
because adr-2609091248201071 is a separate original with its own
superseded_by.
Frontmatter
| id | adr-2610031751065746 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-10-03 |
.abcd/development/decisions/adrs/2610031751065746-the-worktree-store-lives-under-the.md
open on GitHub ↗ · commit history ↗
References6
- adr-2609091248200336A tool never creates directories in user-owned project space; the store's location binds now and its verbs bind when the store shipsrelated
- adr-2609091248200336A tool never creates directories in user-owned project space; the store's location binds now and its verbs bind when the store shipssupersedes
- adr-2610030720195401abcd keeps its own folders out of desktop indexing only by changing those folders, never the computer's search settingsrelated
- adr-2610031751066232The transcript store is spelled under the renamed home, `~/.abcd.noindex/transcripts/<root-sha>/`, and the rest of its decision is unchangedrelated
- itd-2609091014076309Session and agent worktrees live in a machine-scoped store that abcd lists and reclaims, never beside the user's own projectsrelated
- itd-2610030720038073abcd keeps its home folder out of desktop indexing by defaultrelated
Referenced by3
- adr-2610120558328615A private advisory's record never enters the public ledger, its store is never committed, and nothing public carries an advisory id or hintrelated
- adr-2611011153058085A re-render never discards hand-written text unaskedrelated
- itd-2611011151475128Every documentation surface is rendered from its one homerelated
mentions11
- adr-2609091014087993A tool never creates directories in user-owned project space; agent and session scratch is machine-scoped
- adr-2609091248201071The transcript corpus is a sibling store that creates itself through the canonical directory primitive
- iss-2610040729344770The record dashboard (/record/) scrolls sideways at 360 and 390 px: the site-screenshots job measures scrollWidth 476 to 482 there on every pull request since 2026-10-03 23:37Z. The cause is not the genealogy timeline, whose svg sits inside its own overflow-x:auto panel and cannot widen the page, and not the four sub-navigation links the job names first, which scroll inside their own bar; it is the Latest decisions panel. A .list row is a two-column grid (auto 1fr) whose title is a plain span, and a grid item's automatic minimum width is its min-content width, so a title holding one long unspaced token sets the width of the row, which spills past the panel and the page. The two ADRs from #795 (adr-2610031751065746 and adr-2610031751066232) carry such titles, a home-relative path with no break in it, and became the two newest decisions on 2026-10-03. Every .list on the site (dashboard decisions, health, status, development, supersessions) has the same shape, so any record whose title holds a long token reproduces it.
- iss-2610040732240935Record pages scroll sideways at 360 px whenever a record's title or source path holds a long unbroken token, and the overflow audit cannot see it. Every ADR minted with a timestamp id shows its source path, .abcd/development/decisions/adrs/<16 digits>-<slug>.md, as one mono span in the side panel's reclinks paragraph, and the run up to the first hyphen is about fifty characters with no break opportunity: /record/adr/adr-2609091248200336/ measures scrollWidth 374 at 360 px. adr-2610031751065746 and adr-2610031751066232 also carry a home-relative path in their titles, which overflows the record page's h1 (scrollWidth 455). The stylesheet sets no overflow-wrap on body, the title or reclinks, so a block whose text has nowhere to break widens the page. The site-screenshots audit samples only the lowest-numbered record of each type (adr-1, itd-1, iss-1), whose paths and titles are short, so these pages have overflowed since timestamp ADRs began without the job noticing.
- itd-2610112239022766Private security reports stay private until their fix ships
- spc-2609301811532881The worktree store: `abcd ahoy worktree add|list|prune`, one lane primitive, and a notes archive beside it
- spc-2610031309233367abcd-keeps-its-home-folder-out-of-desktop-search-by-default
- spc-2610120557432880when-someone-reports-a-security-hole-in
- spc-2610120941441282a-person-hands-an-item-from-their
- spc-2610170635097509after-update
- the-users-directory-is-theirsThe user's directory is theirs