feat: refuse a target that is a neighbouring product's configuration home - #26
Merged
Conversation
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every command here takes an explicit
--targetbecause 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
@earendil-works/pi-coding-agentpi~/.pi/agentsettings.json@oh-my-pi/pi-coding-agentomp~/.omp/agentconfig.yml,models.ymlTwo products descended from the same code — both publish from a directory called
packages/coding-agent, both keep configuration one level down underagent, 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.
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:
settings.jsonis Pi's whatever else sits beside it;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
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