# 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`. - 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.