diff --git a/.planning/phases/02-engine-isolation-subprocessbackend-indextts-wav-export-dubbi/02-04-SUMMARY.md b/.planning/phases/02-engine-isolation-subprocessbackend-indextts-wav-export-dubbi/02-04-SUMMARY.md new file mode 100644 index 00000000..e26d5f61 --- /dev/null +++ b/.planning/phases/02-engine-isolation-subprocessbackend-indextts-wav-export-dubbi/02-04-SUMMARY.md @@ -0,0 +1,152 @@ +# Plan 02-04 — Engine Compatibility Matrix API + UI (SUMMARY) + +**Status:** delivered. Branch `phase-2-plan-02-04-engine-compat-matrix`; PR +pending. Closes ENGINE-06. + +## What landed + +### Backend +- `backend/services/tts_backend.py` + - `gpu_compat: tuple[str, ...]` class attribute on `TTSBackend` (default + `("cpu",)`) and per-backend overrides (see table below). + - `_HF_TOKEN_MASK_RE` + `_mask_hf_tokens()` — runtime regex redaction + applied to `reason` and `last_error` fields inside `list_backends()` + before serialization. Closes **T-02-12** without depending on the + logging-level `HFTokenRedactor`. + - `list_backends()` now emits `gpu_compat: list[str]` on every entry + and runs the new redactor. +- `backend/api/routers/engines.py` + - **New** `GET /engines/{engine_id}/health` — loopback-gated (T-02-13). + Resolves the backend across tts/asr/llm registries; calls + `SubprocessBackend.health_check()` (spawn-and-ping) for subprocess + engines or falls back to `is_available()` for in-process ones. + Returns `{ id, ok, message, latency_ms }`. Never 500s on a sick + engine — exceptions land in the response body. Unknown id → 404. + - `_ENGINE_INSTANCES: dict[type, object]` cache + `_get_engine_instance` + helper so repeated health checks reuse one singleton per class. + Avoids leaking atexit hooks / spawning extra sidecars. + +### Frontend +- `frontend/src/components/EngineCompatibilityMatrix.jsx` (~270 lines). + Semantic `