Development record
abcd's home ignores itself once, and credentials never sit in a working tree
Drafted by the facilitator on 2026-10-14 from the product thinker's rulings quoted below; the status stays proposed until the product thinker accepts it.
Context
abcd keeps a person's machine-scoped records in ~/.abcd.noindex: redacted session transcripts, run and loop state, labs, lifeboats, interview records, settings backups, and from iss-2610090740139804 private ideate verdicts. A person whose home folder is itself a git repository (a dotfiles repository pushed to a remote) has every one of those files one git add -A && git push from public. Today only the credential store's abcd home and a new sources corpus refuse to write inside a git working tree; every other writer writes there unchecked. The security review of iss-2610090740139804 found the route for private verdicts.
The product thinker's rulings, 2026-10-14, verbatim: "self-ignoring home by default, but instruct the user to manually remove the .gitignore file in ~/.abcd.noindex if they want to add it; aa deliberate user action to ensure it doesn't happen accidentally. Credentials still stay out even then"; and, on refusing every write instead, "I'm inclined to always refuse all of ~/.abcd.noindex/, but that may break things".
Constraints already in force: abcd never changes how a repository works on its own (the security standard of 2026-10-11, abcd-fixes-what-it-adds); the user's directory is theirs; nothing in abcd runs a repository's own git configuration to judge it where the credential rule already avoids doing so.
Decision
We will keep abcd's home out of any repository in the person's home by a file inside abcd's own folder, laid once, and we will keep credentials out of every working tree regardless of it:
- abcd's home ignores itself. Every abcd command but the status line, which writes nothing at all (iss-2610050556383525), before and after it runs, makes sure
~/.abcd.noindex/.gitignoreholding*has been laid in an existing abcd home, with a marker beside it recording that it was. It never creates the home to do so, never overwrites a file, never follows a link, and never reads or runs anything of a repository. - Once, then the person's. While the marker stands, abcd never lays the file again. Deleting
.gitignoreis the deliberate act by which a person lets a repository in their home track abcd's home, and abcd respects it. - Credentials never sit in a git working tree. The credential store's abcd home stays refused inside any working tree, the account's own included, whatever the ignore file says: an ignore file is a convention a person can override with one flag, and a credential is the one record whose leak cannot be taken back.
Alternatives Considered
- Refuse every write into a home inside a working tree. The safest for privacy, and the product thinker's first inclination; rejected because it stops transcripts, worktrees, runs, the install and the dashboard for everyone whose home is a git repository.
- Refuse private ideate verdicts only, like credentials. Rejected as too narrow: transcripts are as sensitive, and every other writer stays exposed.
- Ask git whether the home repository ignores abcd's folder. Rejected:
git check-ignoreruns the home repository's own configuration, which the credential rule avoids on purpose, and it changes nothing for a repository that does not ignore it. - Lay the file whenever it is missing. Rejected: it would undo the person's deliberate deletion, which the product thinker made the opt-in.
- Chosen: a self-ignoring home, laid once, with credentials refused regardless.
Consequences
- A dotfiles repository in the home no longer stages abcd's files by default, including private ideate verdicts, which may therefore be written in the account's own git-tracked home.
- A file the home repository already tracks stays tracked: the ignore file protects new files only, and a
git add -foverrides it. Both are stated in the intent's scope conditions. - Every command walks the home twice more (before and after it runs), a few stats each; a failure to lay prints one stderr line and never fails the command, and a symlinked
~/.abcd.noindex, which no lay can serve, reads as absent and prints nothing. - A verb whose sentence says it writes nothing may be the command that lays the file in a home that lacks it: the write is the front door's, once per home, and the brief says so.
- The front door gains a write into the home before the command runs; the old home's stop still writes nothing.
Frontmatter
| id | adr-2610140859394097 |
|---|---|
| type | adr |
| status | proposed |
| date | 2026-10-14 |
.abcd/development/decisions/adrs/2610140859394097-abcd-s-home-ignores-itself-once-and.md
open on GitHub ↗ · commit history ↗
References1
- itd-2610140858048004abcd's home keeps itself out of a dotfiles repositoryrelated
mentions3
- iss-2610050556383525Product thinker ruling, 2026-10-05: abcd does not touch a person's ~/.claude/ folder, and nothing in it calls abcd, with one exception the person consents to: the status line, which is essential for product thinkers and which a plugin cannot set (a plugin's settings may set only agent and subagentStatusLine; the hooks abcd needs can all live in the plugin's hooks/hooks.json). Today ahoy install offers and writes the statusLine entry, and the person's settings had also gained a SubagentStop entry that called a stale abcd build (the defect that recreated ~/.abcd the same day). Because the status line runs on every refresh in every session, the risks the ruling accepts are: a stale or missing binary at the wired path; a status-line verb that writes state; a line left behind after an uninstall; the person's previous status command recorded once and gone stale; a concurrent write corrupting settings.json so the harness ignores the whole file; a wired path a project or another user can replace; and settings synced to a machine without that path.
- iss-2610090740139804abcd ideate record writes every verdict straight into the repository: a research note under .abcd/development/research/notes/ and a pointer line in .abcd/work/DECISIONS.md, both committed and public once pushed. The product thinker treats every idea put through ideate as secret: an idea and the sources it came from are kept private first and enter the repository only when the person decides it should.
- spc-2610140858477542abcd-s-home-keeps-itself-out-of-a