Skip to content

An installer that owns its namespace whatever git holds of it, with no guard and no --force - #126

Merged
PierreMardon merged 2 commits into
mainfrom
fix/installer-overwrites-its-namespace
Oct 21, 2026
Merged

PierreMardon merged 2 commits into
mainfrom
fix/installer-overwrites-its-namespace

Conversation

@PierreMardon

@PierreMardon PierreMardon commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

A host that keeps .claude/ out of git holds every installed file untracked. There the installer refused each update:

install.py: refusing to overwrite or remove files with unsaved work (uncommitted or untracked):
  .claude/agents/surface-extractor.md
  .claude/skills/surface-plan/SKILL.md
  .claude/skills/surface-plan/templates/blueprint.md
  .claude/skills/surface-plan/templates/plan.md
commit or stash them, or run again with --force to discard them

Each of the four files was byte for byte what an earlier install had written, and nothing in them was the developer's. The check failed in that host too, every time, on its uncommitted lines. A guard that fires on every update is passed with --force by habit, and then protects nothing. The developer decided on 2026-10-16 to remove it.

What changes

  • install.py overwrites and removes in its namespace whatever git holds of the files. It never runs git, the check reports missing, drift and orphan only, and --force is gone.
  • ADR 0039 supersedes 0019: it carries over the ownership by namespace, without the guard. 0019 is marked superseded, and the index lists both.
  • ARCHITECTURE.md and CONTRIBUTING.md describe the installer as it is now.
  • The tests of the guard give way to an update over an installation git does not hold, a check that passes on it, an edit and an orphan overwritten and removed, nothing outside the namespace touched, and an install and a check run with no git at all.

What it costs

An edit made in the host to a file of the namespace is lost at the next install, and git keeps it only when it was committed. The namespace was already the installer's: a host that wants its own skill or agent, or its own copy of one, uses another prefix.

Checked

  • scripts/gate.sh, green locally: 1,891 tests on 3.11 and on the newest Python.

…o guard and no --force

A host that keeps .claude/ out of git holds every installed file untracked. There the
installer refused each update, and its check failed each time, while the files were byte for
byte what an earlier install wrote. A guard that fires on every update is passed with --force
by habit, and then protects nothing. The developer decided on 2026-10-16 to remove it.

- install.py: no refusal on a file git shows as modified, staged, untracked or ignored, no
  `uncommitted` line in the check, no --force, and git is never run.
- docs/adr/0039: the installer owns its namespace whatever git holds of it, and supersedes
  0019, whose ownership by namespace it carries over. An edit made in the host to a file of
  the namespace is lost at the next install, and git keeps it only when it was committed.
- ARCHITECTURE.md and CONTRIBUTING.md describe the installer without the guard.
- tests/install: the guard's tests give way to an update over an installation git does not
  hold, a check that passes on it, and an install and a check that never run git.
@PierreMardon
PierreMardon merged commit 8ee54e0 into main Oct 21, 2026
3 checks passed
@PierreMardon
PierreMardon deleted the fix/installer-overwrites-its-namespace branch October 21, 2026 18:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant