I1102 — The two namespaces are a typed contract, not a habit
Declare the canonical layout of `.ai/` and `.majordomus/` as typed, versioned data — what each namespace holds, what it must never hold, and which lifecycle each directory's contents carry — so that the boundary can be checked rather than remembered.
BLOCKED wave 3 · p0 · deep-work profile · parallel safe
Blocked. This issue cannot start until I2870, I2871, I2872, I2873 are done. The status is derived from that, not declared.
Objective
Declare the canonical layout of `.ai/` and `.majordomus/` as typed, versioned data — what each namespace holds, what it must never hold, and which lifecycle each directory's contents carry — so that the boundary can be checked rather than remembered.
Why
The boundary between portable knowledge and control-plane mechanics is the whole architecture. Stated only in prose it survives until the first subsystem finds it convenient to write an index next to a rule.
Current state
Surveyed on master 905159df7cc (2026-10-21): `.majordomus/` holds nothing tracked; the code reads it only as the pre-`.ai` layout or an optional tool install (lib/common.sh, repository.rs). The control-plane state lives in `.ai/local/`, declared by the manifest's `local:` half (LocalHalf) and kept untracked by doctor. `context/v1` contracts are versioned and proto-derived but carry no typed holds, excludes or lifecycle; nothing refuses an artifact in the wrong half; share/skeleton is hand-copied by lib/init.sh and its manifest already lacks `releases`. OPEN QUESTION for the owner: does control-plane state move from `.ai/local/` to `.majordomus/`, as this milestone's plan assumes, or stay where it is? The slices below declare what exists and decide nothing about it.
Desired state
The layout is a schema-backed declaration; a check reads it and refuses a path that contradicts it.
Scope
- share/schemas
- share/skeleton
Out of scope
- A configuration file restating what a convention already fixes
- Moving existing content; that is the migration issue
Dependencies
- I1101DONE What this tool leaves behind, established by inspection rather than by memory
- I2870READY The layer's layout is declared as typed data: what each half holds, excludes, and the lifecycle of its contents
- I2871BLOCKED A file in the half whose contract excludes it is refused, naming the path and the contract
- I2872BLOCKED The skeleton a new repository receives is derived from the layout declaration
- I2873BLOCKED The manifest schema is generated from typed sections
What waits on this
- I1103BLOCKED Whether a file is authored or derived is a field, not a naming convention
- I1104BLOCKED Both namespaces carry their contracts, all the way down
Acceptance criteria
- Each namespace declares what it holds, in typed and versioned form, generated from the canonical Rust types where generation is available
- `.ai/` is defined as portable semantic material that keeps its meaning without this tool and across providers, and `.majordomus/` as control-plane state that must never hold a second copy of it
- A check refuses an artifact placed in the namespace whose contract excludes it, and names both the path and the contract it violates
- The skeleton a new repository receives is derived from the same declaration rather than being a parallel copy of it
Validation
- cargo test --workspace --all-features
- bin/majordomus doctor
Evidence required
- layout_declared
- 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.
Risk
A layout schema can become a second description of the tree it describes. It declares intent and lifecycle; the tree remains what discovery finds. Declaring `.majordomus/` before the owner answers where control-plane state lives would write down a decision nobody made.
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/I1102.yaml. Read it back with majordomus plan show I1102.