Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2491

A personal layer changes nothing shared: init --personal and install.sh --personal keep the layer one person's own, verify it, and --shared hands it to the team

Where it stands

devtask.issue
Readiness
complete completion is recorded and every required evidence token is present
Status
DONE
Can start
not now
Milestone
Milestone status
ACTIVE
Wave
0
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
2 of 2
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2491

majordomus plan verify I2491

majordomus plan done I2491

What it is

Objective
Let one person use the tool on real work in a repository other people share without changing anything shared: one flag on init and on the installer, every later writer covered by the same mechanism, the result verified at install and on every doctor, the executable reading an untracked layer without being told to, and one command that hands the layer to the team.
Why
ADR 0145. A plain init writes the tracked .gitignore (lib/init.sh, mj_init_gitignore), update writes AGENTS.md, CLAUDE.md and GEMINI.md at the root (lib/update.sh), capture install writes .claude/ (lib/capture.sh), and doctor fails until README.md names AGENTS.md (lib/doctor.sh, mj_validate_bootstrap). No product code wrote .git/info/exclude. The Rust executable enumerates tracked files only (apps/majordomus-cli/src/discovery/mod.rs), so an untracked layer was an empty one unless --discovery filesystem was passed, and no launcher, hook or client configuration passes it. Case 86 held a hand-written list of the installer's flags, so a new flag could go undocumented and pass.
Now
A person who wants a layer of their own writes an exclude file by hand; update and capture install write past it; nothing verifies it; the executable sees no rule, prompt or record in such a layer; there is no step from a personal layer to a shared one.
Wanted
majordomus init --personal and install.sh --personal create the plain layer, cover it in the common git directory's info/exclude, and fail unless git status reads the same after as before. update and capture install cover each path before writing it and refuse a tracked one whole. doctor verifies the cover on every run. Discovery walks the work tree when the manifest is tracked nowhere. init --extend --shared removes the cover and commits nothing. Case 86 reads the installer's flags from its parser.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • In a repository with uncommitted work, init --personal leaves git status --porcelain --untracked-files=all byte-identical, writes no tracked file, and exits 10 if it could not
  • update and capture install under a personal layer leave git status identical, and update refuses (15) a projection target git tracks before writing any target
  • doctor reports the personal layer verified, names a file of it that is tracked, and does not fail the tracked README for not naming AGENTS.md
  • The executable lists the rules of an untracked layer with no --discovery option
  • install.sh --personal verifies the result itself and says so; outside a repository it keeps the installed tool and says which half failed
  • init --extend --shared removes the block, writes the two .gitignore lines, prints the paths to commit, commits nothing, and refuses (15) a layer that is not personal
  • A flag accepted by the installer's parser and absent from its --help fails case 86
Validation
bin/majordomus plan validateMJ_TEST_JOBS=2 bash test/run.sh 2979_a_personal_layer_changes_nothing_shared 86_installer_platform 85_installer 01_initcargo test --manifest-path apps/majordomus-cli/Cargo.toml --doc layer_is_untracked
Evidence required
personal_install_case_2979derived_discovery_doctest
Evidence present
personal_install_case_2979derived_discovery_doctest

Scope

Touches
lib/common.shlib/init.shlib/update.shlib/capture.shlib/doctor.shshare/install/install.sh.inshare/install/INSTALL.md.inshare/commands.yamlapps/majordomus-cli/src/discovery/mod.rsapps/majordomus-cli/src/app.rsapps/majordomus-cli/src/cli.rstest/cases/2979_a_personal_layer_changes_nothing_shared.shtest/cases/86_installer_platform.sh.ai/repo/adrs/0145-a-personal-layer-changes-nothing-shared.md.ai/repo/rules/project/a-personal-layer-changes-nothing-shared.v1.md.ai/repo/use-cases/use-the-tool-as-your-own-in-a-shared-repository.md.ai/repo/features/install.mddocs/CLAIMS.yamldocs/claims/personal-layer-changes-nothing-shared.md.ai/repo/project/issues/I2491.yaml
Not
Access control, or any way around an organisation's rules about tools: the layer is on the disk in plain sightInstalling the commit and push hooks: init installs none in either modeCarrying a personal layer to another machine: it is one checkout's, and the mesh is the way across
Depends on
none
Priority
p1
Profile
implementation
Parallel safe
true
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-12
Updated
2026-10-14T07:39:55Z
Started
2026-10-14T07:39:44Z
Verified
unknown: the record declares no `verified_at`
Completed
2026-10-14T07:39:55Z

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.