private-overlay¶
A private dogfood mode — run SpexCode on a repo you share but don't own, leaving ZERO trace in its tracked files or shared history, so collaborators see an untouched repo.
raw source¶
SpexCode is always a guest (footprint), but the DEFAULT guest still leaves fingerprints a co-owner sees.
Two of them are load-bearing on purpose: .spec + spexcode.json are COMMITTED because git IS the database
(source-of-truth), and the harness contract is folded into CLAUDE.md/AGENTS.md, ignored via a managed
block in the tracked .gitignore (harness-delivery). That "generated, gitignored, never committed" promise
only holds when the file is WHOLLY ours — on a host that already tracks its own CLAUDE.md/AGENTS.md/
.gitignore, gitignoring a tracked file is a no-op, so the block rides inside a tracked file and lands in every
teammate's diff. The complaint writes itself: "you polluted our CLAUDE.md, our git workflow."
Private-overlay is the mode for the solo dogfooder who wants the tool WITHOUT their teammates ever seeing it: one machine-local switch, and SpexCode's whole presence becomes invisible to the shared repo.
expanded spec¶
The switch is private: true in the gitignored spexcode.local.json (portable-layout) — machine-local by
construction, so opting IN is itself never committed. When set, spex materialize (harness-delivery)
delivers the SAME contract but routes every seam that would touch shared history to a per-clone home instead:
- the managed ignore block moves from the tracked
.gitignoreinto.git/info/exclude(which git never commits or shares) and WIDENS to also hide.spec+spexcode.json— the two the default mode commits; - any folded-into contract file the host ALREADY tracks is marked
skip-worktree, so the block sits in the working copy — the harness still auto-discovers it, the user's own prose intact — yet never stages.
It is not merely reversible but an IDEMPOTENT toggle: the two modes fully CANCEL OUT. default→private→default
(or private→default→private) converges to the SAME on-disk state as running that mode once — each mode
re-asserts the inverse of the other (exclude block ⇄ .gitignore block, skip-worktree set ⇄ cleared), so
switch order never matters and running one mode twice changes nothing. This holds only because the managed-block
writer and its remover are exact inverses — the remover strips our block WITHOUT touching the user's own
whitespace (a global collapse there once left a one-line .gitignore diff on the round-trip). The single thing
the render cannot undo for the user: .git/info/exclude hides UNTRACKED paths only, so a .spec/spexcode.json
already committed under default mode must be un-tracked once by hand — materialize PRINTS that git rm --cached
instruction when it detects the state, and spex guide config documents the mode switch + this step, since an
agent does the setup. The deliberate trade is history: with .spec kept out of the host's commits there is no
git-derived version timeline (source-of-truth) — current-state governance, lint, and yatsu still measure,
but the recent/history tabs go quiet. Regaining full history invisibly (a detached spec repo) is a larger,
separate concern this mode does not attempt.