I2871 — A file in the half whose contract excludes it is refused, naming the path and the contract
A check reads I2870's declaration, walks the layer and refuses every path that a contract excludes — control-plane state under .ai/repo, authored knowledge under .ai/local — with '<path> violates <contract>'. doctor reports it and a gate runs it; update refuses a projection target outside the repository, the mj_norm_path guard I1101 found missing.
BLOCKED wave 2 · p0 · implementation profile · parallel safe
Blocked. This issue cannot start until I2870 is done. The status is derived from that, not declared.
Objective
A check reads I2870's declaration, walks the layer and refuses every path that a contract excludes — control-plane state under .ai/repo, authored knowledge under .ai/local — with '<path> violates <contract>'. doctor reports it and a gate runs it; update refuses a projection target outside the repository, the mj_norm_path guard I1101 found missing.
Why
The second slice of I1102. On 2026-10-21 nothing refused a cache or index written under .ai/repo, or a copy of a rule under .ai/local: doctor checks only that .ai/local is untracked and that manifest sections exist.
Current state
doctor checks .ai/local is git-ignored and nothing in it is tracked; scripts/ci/local-never-published keeps local out of the site; nothing reads a contract to judge a path.
Desired state
A misplaced file fails a check that names the path and the contract it violates.
Scope
- apps/majordomus-cli/src
- share/kinds.yaml
- share/skeleton/ai/repo/README.md
- lib/doctor.sh
- lib/update.sh
- test/cases/3405_a_misplaced_artifact_is_refused.sh
- .ai/repo/project/issues/I2871.yaml
Out of scope
- Moving content between halves (I1109 and the migration issues)
Dependencies
What waits on this
Acceptance criteria
- A file a contract excludes is refused, naming the path and the contract; a negative case places one in each half
- update writes no path outside the repository root (the mj_norm_path guard)
Validation
- cargo test --workspace --all-features
- bin/majordomus doctor
Evidence required
- boundary_checked
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I2871.yaml. Read it back with majordomus plan show I2871.