Overview
The Daedalus platform surfaces are the thin operational skin over the training engine. The engine itself is one function — pipelines.executor.run_pipeline (src/daedalus/pipelines/executor.py) — that runs the compiled compile → skeleton → enrich operator pipeline for a feature service.
Every surface wraps that same in-process API. None of them re-derives feature logic: they all resolve the catalog, compile the service, and call the executor through the shared method layer. The result is one engine reached five different ways, with no second implementation to keep in sync.
The surfaces
| Surface | Module | Entry point | Use it for |
|---|---|---|---|
| Dagster orchestration | daedalus.definitions | uv run dagster dev -m daedalus.definitions | Scheduled / partitioned production runs, lineage, retries |
| JSON-RPC API | daedalus.api | daeda serve-api | HTTP control plane (catalog / service / compile / runs / lineage) |
| MCP server | daedalus.mcp | daeda mcp | Tool access for external (non-Claude-Code) agents over stdio |
| Agent CLI | daedalus.commands.agent | daeda lineage, daeda materialize-day | Ad-hoc lineage + single-day materialization for sample output |
| MLflow projection (optional) | daedalus.tracking | TrainingRunConfig.tracking | Off-by-default experiment tracking of training run records |
One in-process API
The JSON-RPC method layer (src/daedalus/api/methods.py) is the canonical surface. Its METHOD_HANDLERS table maps method names to plain functions over an ApiContext (catalog + run config + a runs backend). Both the HTTP server (daedalus.api.app) and the MCP server (daedalus.mcp.server) dispatch into that same table — the MCP tools are literally thin wrappers that delegate to daedalus.api.methods.
┌───────────────────────────┐
HTTP /rpc ───────▶ │ │
MCP tools ──────▶ │ daedalus.api.methods │
Dagster ops ──────▶ │ METHOD_HANDLERS + │ ──▶ pipelines.executor
daeda CLI ────────▶ │ compile / executor │ .run_pipeline
└───────────────────────────┘No feature logic is re-derived
The catalog, the compiler, and the executor are imported, not reimplemented. Adding a feature is still a YAML edit (see Training overview); the surfaces only change how you reach the engine, never what it computes.
The GUI is deliberately out of this repo
There is no web UI shipped here. The planned GUI is a separate stack (SvelteKit + shadcn-svelte) that consumes the JSON-RPC contract over HTTP. Keeping it out of this repository keeps the backend lean and the contract — not a bundled frontend — the integration boundary.
See also
- Training Pipeline overview — the engine the surfaces wrap.
- CLI reference — the full
daedacommand group.