Skip to content

feat: refuse a target that is a neighbouring product's configuration home - #26

Merged
rldyourmnd merged 1 commit into
mainfrom
feat/a-neighbours-home
Aug 27, 2026
Merged

feat: refuse a target that is a neighbouring product's configuration home#26
rldyourmnd merged 1 commit into
mainfrom
feat/a-neighbours-home

Conversation

@rldyourmnd

Copy link
Copy Markdown
Contributor

Every command here takes an explicit --target because a change aimed at a guessed path is a change aimed at someone else's state. That rule binds this program. It does nothing about a caller who names the wrong place confidently — and Pi has a neighbour close enough to make that easy.

Measured, not inferred from the name

package command home reads
Pi Coding Agent @earendil-works/pi-coding-agent pi ~/.pi/agent settings.json
Oh My Pi @oh-my-pi/pi-coding-agent omp ~/.omp/agent config.yml, models.yml

Two products descended from the same code — both publish from a directory called packages/coding-agent, both keep configuration one level down under agent, and the two homes are one word apart.

What makes the confusion worth stopping is that it is silent. A Pi setup written into an Oh My Pi home is not rejected by anything downstream — it is ignored, and the directory looks configured. A failure that leaves everything looking right is the one worth refusing before it happens.

$ pi-setup-system install baseline --target ~/.omp/agent
unsupported_native_surface: …/.omp/agent holds config.yml and none of Pi Coding
Agent's own files, which is what Oh My Pi's configuration home looks like. Oh My
Pi keeps its configuration in ~/.omp/agent; this program configures Pi Coding
Agent in ~/.pi/agent. Nothing has been changed. Name the target you meant.

The refusal names both homes, because a stop a caller cannot act on is half an answer.

Three conditions, all required

The cost of a wrong refusal is a caller who cannot configure their own target, so each is asserted rather than assumed:

  • the neighbour's marker is present;
  • none of this provider's own namespaces are — a home holding settings.json is Pi's whatever else sits beside it;
  • the target is not already managed here, which settles it outright.

Six of the seven declare no neighbour

A marker listed without evidence is a refusal waiting to happen, so nothing is listed that was not measured. The empty case — what most of the estate runs — is asserted too.

Observed red both ways

defect reintroduced failure
check removed a neighbour's home is planned against
own-files condition removed a target holding our own file was refused as a neighbour's

A refused plan also leaves no slot and no journal, which the test asserts.

Gate

fmt, clippy -D warnings, 362 tests, conformance 23/23 on all seven.

Sources

https://claude.ai/code/session_012UZkeU7yQhyZqKAaDaQEjA

…home

Pi and Oh My Pi are one word apart -- ~/.pi/agent against ~/.omp/agent -- the
same shape, descended from the same code. Pi reads settings.json and Oh My Pi
reads config.yml, so a Pi setup written into an Oh My Pi home is not rejected by
anything: it is ignored, and the directory looks configured.

A harness may now declare what a neighbour's home looks like, and this refuses
one before planning and again before any mutation, naming both homes. Three
conditions must all hold, because the cost of a wrong refusal is a caller who
cannot configure their own target.

Six of the seven declare no neighbour: a marker listed without evidence is a
refusal waiting to happen.

Rendered from NDDev-it-com/setup-systems@1c0bf93.

Claude-Session: https://claude.ai/code/session_012UZkeU7yQhyZqKAaDaQEjA
@rldyourmnd
rldyourmnd merged commit 316cdeb into main Aug 27, 2026
24 checks passed
@rldyourmnd
rldyourmnd deleted the feat/a-neighbours-home branch August 27, 2026 00:29
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