Skip to content

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

Part of two-folder-integration — A repository that adopts Majordomus gains two directories and two lines, and can give them back.

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

What waits on this

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.

Searches the titles and descriptions of every page this site publishes.