---
name: dag_topo_sort
kind: function
lang: go
domain: core
version: "1.0.0"
purity: pure
signature: "func DagTopoSort(steps []DagStep) ([][]DagStep, error)"
description: "Ordenamiento topologico de steps de un DAG usando el algoritmo de Kahn. Retorna niveles donde cada nivel contiene steps que pueden ejecutarse en paralelo. Detecta ciclos y retorna error si los hay."
tags: [dag, topological-sort, graph, kahn, pure]
uses_functions: []
uses_types: [dag_step_go_core]
returns: []
returns_optional: false
error_type: ""
imports: [fmt]
params:
  - name: steps
    desc: "lista de DagStep con sus dependencias definidas en el campo Depends"
output: "slice de niveles donde cada nivel es un slice de DagStep que pueden ejecutarse en paralelo; error si hay ciclo"
tested: true
tests:
  - "cadena lineal A->B->C produce tres niveles"
  - "diamond A->B A->C B->D C->D produce cuatro niveles"
  - "steps paralelos sin depends produce un solo nivel"
  - "ciclo A->B->A retorna error"
test_file_path: "functions/core/dag_topo_sort_test.go"
file_path: "functions/core/dag_topo_sort.go"
---

## Ejemplo

```go
steps := []DagStep{
    {Name: "a"},
    {Name: "b", Depends: []string{"a"}},
    {Name: "c", Depends: []string{"a"}},
    {Name: "d", Depends: []string{"b", "c"}},
}
levels, err := DagTopoSort(steps)
// levels[0] = [a]
// levels[1] = [b, c]   (paralelo)
// levels[2] = [d]
```

## Notas

Funcion pura. Implementa Kahn's algorithm: calcula in-degree inicial, pone en cola los steps con in-degree 0, extrae un nivel completo por iteracion y reduce el in-degree de los dependientes. Si al terminar hay steps sin procesar, hay un ciclo. El orden dentro de cada nivel no esta garantizado — depende del orden del slice de entrada.
