DAG API Specification
Scope
API-layer composition for DAG design, runtime, diagnostics, and observability operations. Exposes endpoint-facing contracts, response shapes, and controller implementations that orchestrate domain services from dag-core, dag-runtime, dag-projection, and dag-worker.
Boundaries
- Does not own core domain contracts (
IDagDefinition,IDagRun,ITaskRun, state machines) -- those belong todag-core. - Does not own runtime orchestration logic -- delegates to
dag-runtimeservices. - Does not own worker execution or DLQ behavior -- delegates to
dag-worker. - Does not own projection read-model logic -- delegates to
dag-projection. - Depends on
dag-core(SSOT),dag-runtime,dag-projection, anddag-workeras sibling dependencies.
Architecture Overview
The package follows a controller-composition pattern:
- Contracts (
contracts/): Define API request/response types and theIProblemDetailserror shape. - Controllers (
controllers/): Thin API controllers that delegate to domain services and map results to API responses. Four controllers: Design, Runtime, Diagnostics, Observability. - Composition roots (
composition/): Factory functions that wire domain services and controllers together from port dependencies.createDagControllerComposition-- assembles all four controllers.createDagExecutionComposition-- assembles runtime + worker loop for in-process execution.RunProgressEventBus-- pub/sub bus forTRunProgressEventstreaming.
Type Ownership
This package is SSOT for:
IProblemDetails-- RFC 7807-style error detail shapeTDesignApiSuccess<TData>,TDesignApiFailure,TDesignApiResponse<TData>-- design API result aliasesIApiSuccess<TData>,IApiFailure<TError>,TApiResponse<TData, TError>-- generic API envelope typesICreateDefinitionRequest,IUpdateDraftRequest,IValidateDefinitionRequest,IPublishDefinitionRequest,IGetDefinitionRequest,IListDefinitionsRequest,IListNodeCatalogRequest-- design API request typesIDefinitionListItem,IDefinitionValidationResult-- design API response typesITriggerRunRequest,IQueryRunRequest,ICancelRunRequest-- runtime API request typesIAnalyzeFailureRequest,IRerunRequest,IReinjectDeadLetterRequest,IFailureCodeCount,IFailureAnalysis-- diagnostics API typesIQueryRunProjectionRequest,IQueryLineageProjectionRequest,IObservabilityDashboardData-- observability API typesIDagControllerComposition,IDagControllerCompositionDependencies,IDagControllerCompositionOptions-- controller composition typesIDagExecutionComposition,IDagExecutionCompositionDependencies,IDagExecutionCompositionOptions-- execution composition typesIRunProgressEventBus,TRunProgressEventListener-- event bus typesINodeCatalogService-- node catalog port interfaceIDiagnosticsPolicy-- diagnostics policy interface
Public API Surface
toProblemDetails(error, instance, correlationId?)-- mapsIDagErrortoIProblemDetailstoRuntimeProblemDetails(error, instance, correlationId?)-- runtime-specific aliasDagDesignController-- CRUD + validate + publish for DAG definitionsDagRuntimeController-- trigger, query, cancel runsDagObservabilityController-- run/lineage/dashboard projection queriesDagDiagnosticsController-- failure analysis, rerun, DLQ reinjectcreateDagControllerComposition(deps, options?)-- wires all controllerscreateDagExecutionComposition(deps, options)-- wires runtime + worker loopRunProgressEventBus-- in-memory pub/sub for run progress events
Extension Points
INodeCatalogService-- implement to provide node manifest listing and type validation.IDiagnosticsPolicy-- configure to enable/disable DLQ reinject.- All composition factories accept port interfaces (
IStoragePort,IQueuePort,IClockPort,ILeasePort,ITaskExecutorPort) fromdag-core, allowing custom implementations.
Error Taxonomy
All API errors use the IProblemDetails shape with URN-based type field:
urn:robota:problems:dag:validation(HTTP 400) -- validation failuresurn:robota:problems:dag:state_transition(HTTP 409) -- invalid state transitionsurn:robota:problems:dag:lease(HTTP 400) -- lease contract violationsurn:robota:problems:dag:dispatch(HTTP 503) -- dispatch unavailabilityurn:robota:problems:dag:task_execution(HTTP 500) -- task execution failures
Controller-specific codes:
DAG_VALIDATION_DEFINITION_NOT_FOUND(404)DAG_VALIDATION_NODE_TYPE_NOT_REGISTERED(400)DAG_VALIDATION_NODE_CATALOG_NOT_CONFIGURED(400)DAG_POLICY_REINJECT_DISABLED(409)
Class Contract Registry
Interface Implementations
| Interface | Implementor | Kind | Location |
|---|---|---|---|
IRunProgressEventBus | RunProgressEventBus | production | src/composition/run-progress-event-bus.ts |
INodeCatalogService | (external: BundledNodeCatalogService in dag-server-core) | port | N/A (consumed via DI) |
IDiagnosticsPolicy | (external) | port | N/A (consumed via DI) |
Inheritance Chains
None. Controller and composition classes are standalone.
Port Consumption via DI
| Service/Controller | Injected Port (from dag-core) | Location |
|---|---|---|
createDagControllerComposition | IStoragePort, IQueuePort, IClockPort, ILeasePort, ITaskExecutorPort | src/composition/ |
createDagExecutionComposition | IStoragePort, IQueuePort, IClockPort, ILeasePort, ITaskExecutorPort | src/composition/ |
Cross-Package Port Consumers
| Port (Owner) | Consumer | Location |
|---|---|---|
IStoragePort (dag-core) | Controller composition factories | src/composition/ |
IQueuePort (dag-core) | Controller composition factories | src/composition/ |
IClockPort (dag-core) | Controller composition factories | src/composition/ |
ILeasePort (dag-core) | Controller composition factories | src/composition/ |
ITaskExecutorPort (dag-core) | Controller composition factories | src/composition/ |
RunOrchestratorService (dag-runtime) | DagRuntimeController | src/controllers/ |
ProjectionReadModelService (dag-projection) | DagObservabilityController | src/controllers/ |
WorkerLoopService (dag-worker) | Execution composition | src/composition/ |
Test Strategy
- Unit tests:
src/__tests__/run-progress-event-bus.test.ts,execution-composition.test.ts - E2E tests:
design-flow-e2e.test.ts,runtime-flow-e2e.test.ts,diagnostics-flow-e2e.test.ts,observability-flow-e2e.test.ts,single-dagrun-e2e.test.ts - Tests use in-memory port implementations from
dag-core. - Coverage focus: controller request/response mapping, composition wiring, error-to-problem-details translation, event bus pub/sub lifecycle.
- Run:
pnpm --filter @robota-sdk/dag-api test