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
2of2
Moves
plan.transitionWhat 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.