# L1 — Composition root & IPC

**Binôme :** `dev-ipc-bridge` / `test-ipc-bridge`
**Zones :** `crates/app-tauri`, `frontend/ports`, `frontend/adapters`
**Dépendances amont :** L0 (ports figés).
**Statut :** suivant (enchaîné après L0).

## Objectif

Mettre en place le **squelette Tauri qui tourne** : composition root (DI), pont IPC bidirectionnel, et la couche ports/adapters du frontend (avec mocks) — pour que le front soit développable **sans backend** dès les lots suivants.

## Périmètre (DEV)

### Backend `app-tauri` (driving adapter + composition root)
- **Composition root** : instancier les adapters concrets (au départ : `LocalFileSystem`, `TokioBroadcastEventBus`, `SystemClock`, `UuidGenerator`) et les injecter dans les use cases via `tauri::State` (`Arc<dyn Port>`).
- Registre des `#[tauri::command]` (squelette, mapping DTO ↔ use case) et `ErrorDTO`.
- **`TauriEventRelay`** : souscrit l'`EventBus` domaine → relaie en events/Channels Tauri.
- **Bridge PTY ↔ Tauri Channel** (`tauri::ipc::Channel`) : infrastructure générique de flux d'octets par session (sera consommée par L3).
- App Tauri v2 minimale qui démarre (fenêtre vide).

### Frontend (hexagonal côté UI)
- `frontend/ports` : gateways TS (`AgentGateway`, `TerminalGateway`, `ProjectGateway`, `LayoutGateway`, `GitGateway`, `RemoteGateway`).
- `frontend/adapters` : impl via `@tauri-apps/api` (`invoke`/`listen`/`Channel`).
- `frontend/adapters/mock` : impl mock de chaque gateway.
- `frontend/app` : bootstrap React + Vite, provider de DI des adapters (réel vs mock).

## Périmètre (TEST)

- Backend : mapping commands ↔ use cases (un use case in-memory simple validant le wiring).
- Relais `EventBus` → events Tauri (un `DomainEvent` publié arrive bien côté relais).
- Front : chaque gateway mock satisfait l'interface du port (typecheck + tests Vitest).
- Provider de DI : bascule réel/mock fonctionnelle.

## Definition of Done

- L'app Tauri démarre (fenêtre vide) sur Linux.
- `cargo test -p app-tauri` et `vitest` verts.
- Front compile et tourne en mode **mock** sans backend.
- Aucun `invoke()` direct dans les composants (uniquement via gateways).

## Points d'attention / spikes

- Forme du bridge PTY↔Channel (backpressure) — préparé ici, stressé en L3.
- Convention de (dé)sérialisation DTO Rust ↔ TS (serde camelCase ?). À figer ici.
