Skip to content

Report conflicts when two sources provide the same path #470

Open

Description

@David-Noble-at-work

Personal beats team beats base -- that is the point of the layer tree, and with one repository it is never
exercised. With three sources it happens routinely, and a silent win is indistinguishable from a mistake.

Layer precedence is untested today. cmd/writ/scenario_integration_test.go registers only personal,
so no test has ever had two layers to choose between.

Starting material exists. The retired scripts/setup-test-layers.sh simulated three layers with a
deliberate collision -- team's .config/git/ignore shadowing base's -- which is exactly the fixture this
needs. Harvest that shape as a second checked-in fixture beside testdata/personal-repo; do not
resurrect the script, which copied real content out of ~/Workspace/Personal and filtered secrets by
matching four filenames.

Exit: an overridden path is reported, naming the winning source and the ones it shadowed, proved by a
scenario with base, team and personal registered.


Epic: #466 · Feature: #467

Activity

  1. David-Noble-at-work commented on Sep 7, 2026

    @David-Noble-at-work
    ContributorAuthor

    Observed 2026-09-07 on Danoble-MBP-A, every deploy since noblefactor-ops#182: four [△] source collision(s) resolved by layer/specificity lines, one per file that both the base and the personal layer now carry under Home/common/.local/ (Declare-BashScript, its man page, its bash and zsh completions). Personal wins each, correctly; the lines repeat because the plan is rebuilt each run and the situation is unchanged until noblefactor-ops#147 Phase 2 removes personal's copies.

    Open, not ruled: severity. This issue asks that an overridden path be reported naming the winner and the shadowed; it does not say at what level. A personal file shadowing a base file is the normal state of a layered system, so a warning glyph on each one, every run, becomes noise once personal deliberately overrides base content. One shape: routine cross-layer shadowing is narrated as a note (and summarized — "4 paths shadowed by personal, --verbose lists them"), and △ is kept for what is actually surprising: a tie within one layer, or a shadowing that flips between runs. The user's reaction to the explanation: "that makes sense." The ruling is theirs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Epic:LayerSplitSplit the dotfiles into base, team, and personal layerstaskImplementation work item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions