# L0 — Socle domaine & ports

**Binôme :** `dev-core-domain` / `test-core-domain`
**Crate :** `crates/domain` (pur, zéro I/O)
**Dépendances amont :** aucune (fondation du projet).
**Statut :** en cours.

## Objectif

Poser le **cœur hexagonal** : toutes les entités, value objects, invariants, **ports (traits)**, domain events et la **logique de layout pure**. Aucun adapter, aucune I/O.

## Périmètre (DEV)

### Entities & Value Objects (cf. ARCHITECTURE §3)
- IDs typés (`ProjectId`, `AgentId`, `TemplateId`, `ProfileId`, `SessionId`, `WindowId`, `TabId`, `NodeId`).
- `Project`, `ProjectPath`, `Agent`, `AgentOrigin`, `AgentTemplate`, `TemplateVersion`, `AgentProfile`, `ContextInjection`.
- `TerminalSession`, `SessionKind`, `PtySize`, `RemoteRef`/`SshAuth`, `GitRepository`, `AgentManifest`/`ManifestEntry`, `Workspace`/`Window`/`Tab`.
- `MarkdownDoc` (VO contenu .md).
- Tous les **invariants** documentés en §3 doivent être appliqués (constructeurs validants / `try_new`).

### Logique de layout pure (cf. ARCHITECTURE §7)
- `LayoutNode` (`Leaf`/`Split`/`Grid`), `SplitContainer`, `WeightedChild`, `GridContainer`, `GridCell`.
- Opérations **pures** : `split`, `merge`, `resize`, `move` → `LayoutTree -> Result<LayoutTree, LayoutError>`.
- Validation des invariants (poids > 0, pas de chevauchement de spans, surface couverte, 1 session par leaf max).

### Ports (traits) — définitions seulement, pas d'impl
`AgentRuntime`, `PtyPort`, `RemoteHost`, `ProcessSpawner`, `FileSystem`, `TemplateStore`, `ProjectStore`, `AgentContextStore`, `GitRepository`, `EventBus`, `Clock`, `IdGenerator` (signatures conceptuelles en ARCHITECTURE §4).

### Domain events & erreurs
- `DomainEvent` (enum complet de §3.2).
- Types d'erreur par domaine (`LayoutError`, et erreurs de port définies ici si partagées).

### serde
- Autorisé **uniquement** pour les types persistés (manifeste, layout, profils) — dérive `Serialize`/`Deserialize`. Aucune autre dépendance I/O.

## Périmètre (TEST)

- Invariants d'entités : rejets attendus (chemin relatif, `synchronized` sans template, port SSH hors plage, etc.).
- **Layout** (cœur du lot) : `split`/`merge`/`resize`/`move` — cas nominaux + cas d'erreur (chevauchement, poids ≤ 0, span hors grille, session dupliquée).
- Déterminisme via `FixedClock`/`SeqIdGenerator`.
- `ContextInjection` : validation des 4 variantes (target relatif, var env valide, flag non vide).
- Sérialisation round-trip JSON des types persistés.

## Definition of Done

- `cargo test -p domain` vert.
- `crates/domain/Cargo.toml` ne dépend d'aucun crate I/O (vérifié).
- Tous les ports compilent et sont documentés.
- Logique de layout couverte (cas limites inclus).

## Notes / points d'attention

- Choisir `async_trait` vs `-> impl Future` pour les ports I/O (à figer ici, impacte tous les lots).
- Garder les traits **fins** (Interface Segregation) : ne pas fusionner FS/PTY/Process.
